Compare commits
1768 Commits
Author | SHA1 | Date | |
---|---|---|---|
320d814df4 | |||
8953017b9d | |||
874e896178 | |||
973632b4ae | |||
5fa9663d99 | |||
1ed31ad638 | |||
da94f781b3 | |||
d4640219a6 | |||
1fc048fec9 | |||
d6d5477022 | |||
691bcfa061 | |||
3148db54b5 | |||
|
58ee240c80 | ||
ca090638da | |||
4f05231b04 | |||
730577b4a4 | |||
51f2c41b31 | |||
|
2de3ac9044 | ||
|
09f632cc6d | ||
339da62a23 | |||
5a4d3d420f | |||
cd1e8adce3 | |||
|
e676ca47dc | ||
637758c13e | |||
6a0c067cef | |||
a956f85fc7 | |||
1a137bb683 | |||
57eacfb953 | |||
88247f0de3 | |||
eb0bc9ae5c | |||
7f133f17f7 | |||
944b0fe6c5 | |||
eae2b3df81 | |||
3b3abe615d | |||
756014d568 | |||
6d4c438d62 | |||
5c2743c01a | |||
eeb660293c | |||
01261f8c92 | |||
06078cc8e7 | |||
a37ea34670 | |||
56418b1551 | |||
dc9f128b79 | |||
2533b362ab | |||
0c416c7d7c | |||
fd94b0108c | |||
99fb30b0ec | |||
81e2e345a7 | |||
ce5071c3e3 | |||
1210561448 | |||
9294697d58 | |||
3a92a54cd5 | |||
b6a70659b1 | |||
cd22f3e9d8 | |||
8aba48a1d2 | |||
|
423ef8d36f | ||
098abccde7 | |||
|
75aaaf21b7 | ||
622027302f | |||
5b999eff2d | |||
562eeceac2 | |||
f9e0755b23 | |||
74b9faf7af | |||
|
9978074fbc | ||
2df50d9096 | |||
14aba49194 | |||
17df9c8dbc | |||
6dae66540d | |||
0317979c92 | |||
a4b3824a42 | |||
f1200c4999 | |||
d7365d719f | |||
42f5c1a20a | |||
74e69aa520 | |||
20da5d2f36 | |||
fe951ad050 | |||
|
8edcc7e57f | ||
|
62ad932aa7 | ||
33fb35bd34 | |||
|
003f98b18c | ||
6e3720f8e4 | |||
|
4f3d0a57f9 | ||
|
f28659a025 | ||
|
026b463fb7 | ||
bfe0065f1c | |||
91a1b1872c | |||
cf67b11295 | |||
dd4169f815 | |||
dbe04bb342 | |||
98f2b68560 | |||
805bb610a5 | |||
3148d0eb2a | |||
67439317c4 | |||
5e90541918 | |||
704862faad | |||
c8df65baee | |||
49d86a55be | |||
de3db5527b | |||
d115befab9 | |||
6b20d0c8b6 | |||
b296525e39 | |||
7a16536341 | |||
aa94e21602 | |||
bb932e5b9c | |||
a9ca845c80 | |||
b8bad36510 | |||
1c3d9c98b4 | |||
dc9577ff6a | |||
2336e406f4 | |||
84f5bca0a9 | |||
fb35d4fff9 | |||
ace1423a13 | |||
3b9a8e5456 | |||
c60b247ef7 | |||
89f0f5c688 | |||
7bdf01d344 | |||
c0d9a461af | |||
1844d91893 | |||
1a3594311b | |||
8b6dcf4db0 | |||
9d8e057410 | |||
8a2586d01b | |||
be5d5d182b | |||
38b653d075 | |||
88a1b978ce | |||
a2946bd67d | |||
410b925b8d | |||
4f9b48135c | |||
5bc4698520 | |||
0f64ad3674 | |||
93f949d914 | |||
b971d2d85c | |||
edd279ca8e | |||
525b7de7e2 | |||
b6bfc39cbf | |||
3f4420181c | |||
94eaed0b2c | |||
|
d747568575 | ||
2cda0cbb66 | |||
d41db57211 | |||
bc99761b7a | |||
fc2c9d791a | |||
f9b6eeb92c | |||
2d60df2417 | |||
6dc0bc8d34 | |||
110322ab47 | |||
e40be770c3 | |||
d32f9c02ce | |||
83185a6b32 | |||
a9644ddec1 | |||
e9b29737c9 | |||
4f03a73f9a | |||
647bd84995 | |||
eb60d6b39f | |||
4d038b0777 | |||
67b0a6005e | |||
d605c80332 | |||
98954281d5 | |||
58e0ddc952 | |||
f1030c0298 | |||
9cb71e62c1 | |||
60ff2c853c | |||
6c4e883a8a | |||
25a4a3db40 | |||
5f2aab1501 | |||
8a2fbc6f38 | |||
2b6779af8f | |||
efa1372cdc | |||
|
64e902c5a1 | ||
ee97a2f932 | |||
4960397655 | |||
da03edb665 | |||
712117dfc4 | |||
048e2dd3f0 | |||
3beed6b2ec | |||
c62a98b22a | |||
20d97e5bce | |||
2581119295 | |||
95c55aa931 | |||
059bc5ac39 | |||
324a85fb7f | |||
28e968b15f | |||
9d2c4404c0 | |||
d61b142e40 | |||
d1a1f51bf0 | |||
0cf963ac5e | |||
5921115af0 | |||
87d7478864 | |||
3179d5b669 | |||
8ced21fe86 | |||
84e4de1e7a | |||
39309d1914 | |||
194b396788 | |||
7dd32257d1 | |||
6de62a6929 | |||
1c6433eb73 | |||
762998cd4b | |||
73abafebac | |||
81cd6f75fe | |||
42f28a72da | |||
69916d8f6d | |||
ec2e29083b | |||
98a5570ef6 | |||
3ec1610fff | |||
bc39c22c29 | |||
2e3b718fe2 | |||
be8182ffcc | |||
dfaaffcff4 | |||
de782c7fea | |||
3ea37e0e11 | |||
0f1407682e | |||
e40e821b5f | |||
31ad9138ef | |||
9cd07fe829 | |||
4dec01bdaa | |||
e64670e5aa | |||
7c07d7f3e2 | |||
f9c5d4dbaf | |||
52f203b43d | |||
35d80bdcee | |||
a6b7367002 | |||
75c04cae38 | |||
915b6786d9 | |||
b561f7eec8 | |||
89556ae68f | |||
33149aafb9 | |||
edf8850952 | |||
393bf21f30 | |||
03a2051ad7 | |||
51ad3e70d3 | |||
9417960281 | |||
a312bc5e8f | |||
a617eebeec | |||
38e53aaa6a | |||
8b6d411d58 | |||
1b436f9535 | |||
64fccc272c | |||
ead790853e | |||
|
47e7a81f6f | ||
|
73b11b48af | ||
|
5bb282b3bd | ||
|
9608c5a83d | ||
568e539e49 | |||
|
8c99b13e12 | ||
35bbb22c56 | |||
|
169b8d3b76 | ||
d8a63bc2cd | |||
f105a0b5d2 | |||
843a6e11ae | |||
a5320b07d7 | |||
3eafe870bc | |||
82704cfbd6 | |||
88ba0f148e | |||
|
19376e7f6c | ||
|
3ae6e5cdb4 | ||
29c9d8dc7d | |||
7c822661e6 | |||
3a85c9060b | |||
834e75cdd6 | |||
6ea5f5af11 | |||
e2099735e1 | |||
|
8b1e218862 | ||
e718518698 | |||
cc55a13151 | |||
0fc11b3885 | |||
16b7297d19 | |||
1683b7c72a | |||
f4ad0a2351 | |||
7f6b193656 | |||
15dbe153f5 | |||
547efb38e4 | |||
f44ccdc4e1 | |||
1549125665 | |||
cf76dd744d | |||
57afba72e8 | |||
3f97ad09df | |||
00213f806c | |||
d0f1c50f51 | |||
bc16b7c25f | |||
5424424eaf | |||
7aed881f08 | |||
ca169c5bc7 | |||
7041adcdfb | |||
ffcdb223cc | |||
c70bdfcd90 | |||
d512573af8 | |||
0527a9def1 | |||
09ef31e750 | |||
9213453bc3 | |||
|
8c3cbf0489 | ||
|
45ac4ec1ee | ||
e3123d7c45 | |||
680059dece | |||
e9526daf1c | |||
a2774b8fb9 | |||
5618a334d9 | |||
|
8b32bebdc2 | ||
788a18f7f1 | |||
ad186da482 | |||
345cb1748a | |||
e8f07d27ef | |||
e64fe1eb17 | |||
|
e6dfd1dfec | ||
|
a56e775ab9 | ||
|
ce3a59b13c | ||
|
85d1acad5e | ||
|
13dd999158 | ||
|
cb3bd91b76 | ||
|
d5130ed655 | ||
|
199438285c | ||
|
a149731c46 | ||
|
2e629df611 | ||
|
fcdc1021af | ||
|
ce5cbaa850 | ||
dcd243505d | |||
|
4d32e942a3 | ||
|
95909d7ed4 | ||
|
fad8ca5854 | ||
|
cd3778ca0d | ||
|
8fe1498847 | ||
|
0edc9657b4 | ||
9fe423db62 | |||
|
a9e7114375 | ||
|
e150bd1d26 | ||
|
4c9f963aa7 | ||
|
9d81661cfe | ||
fcd3cacfbc | |||
|
3edc959096 | ||
|
d656d8fe38 | ||
|
eccbb59bcc | ||
|
8457e51717 | ||
|
227c7a9410 | ||
|
9c92fda11b | ||
|
896f090aba | ||
|
5363698020 | ||
|
aa0c213cc3 | ||
|
5009f51342 | ||
|
b340206d3a | ||
|
2cbb0c4134 | ||
|
8c574ec88c | ||
|
5af9f92102 | ||
|
6bf331b355 | ||
|
4b74ceb854 | ||
|
25054c4e0f | ||
|
fbe53e3b29 | ||
|
5397f7014a | ||
|
ebb3cf8ab1 | ||
|
55e7dbe704 | ||
|
f13d938bde | ||
|
0ff5c7c28a | ||
|
fc789e6ef9 | ||
|
9f3ce28877 | ||
|
4e7f9eac50 | ||
|
2fc85b1068 | ||
|
930ea9a6ac | ||
|
d4ebd68052 | ||
|
e9d41c4869 | ||
|
577c2be622 | ||
|
8e7fe6bcd7 | ||
|
973cc5746e | ||
|
8326eb3ebf | ||
|
e9baceb039 | ||
|
720b72f8e4 | ||
a3ebe57f1f | |||
|
d9dc5e0ed7 | ||
|
bc024c3253 | ||
|
137d92624e | ||
|
5d13afd8f6 | ||
|
5628f42782 | ||
|
eae5b8bb06 | ||
|
40fef4e360 | ||
|
ab35143e18 | ||
|
f176ac628b | ||
|
7a09546198 | ||
|
47672a5eb6 | ||
|
3307ba01dc | ||
7d3558460b | |||
|
2fdb7e4525 | ||
|
48d8805605 | ||
|
e4a104f52e | ||
|
ff09ea09cc | ||
|
a4ce7ffea7 | ||
0f8b5da18a | |||
|
1a358c2f09 | ||
|
b56881bf01 | ||
|
59de37a12b | ||
|
2a819b1b98 | ||
|
a9eb9f8cf2 | ||
|
70f630d125 | ||
|
0075e2169c | ||
|
f47a67fd57 | ||
|
b2bb9cfb92 | ||
|
a3f68852ce | ||
|
2031d82600 | ||
|
31b09570f9 | ||
|
b18aef404a | ||
|
6fb71835bf | ||
|
22aaedd3be | ||
|
758203b6d3 | ||
|
57182b0589 | ||
|
0f44076e48 | ||
|
094139dead | ||
|
30fd4bad7c | ||
|
9fef4b2871 | ||
|
db702e43c9 | ||
|
93c5cb995a | ||
|
5fada43676 | ||
|
adac8fb3fd | ||
|
0eef94a164 | ||
|
3c0c880661 | ||
|
e122d020eb | ||
|
a8629df5ec | ||
|
415005e2f6 | ||
|
6e78c45c67 | ||
|
6ac77e629a | ||
|
313e854723 | ||
|
4332d9c205 | ||
|
833d2a9096 | ||
|
6e71f0542b | ||
f6fe379a54 | |||
|
cc5adc17b2 | ||
284318a287 | |||
|
edcd348bca | ||
|
21ae86958d | ||
|
0dca0bb57d | ||
|
933ced4575 | ||
|
232d69cf72 | ||
|
c1850f0bb3 | ||
|
ebd6684d4a | ||
|
62f958622c | ||
|
626145340e | ||
|
84b0d891e0 | ||
|
ef98d5056a | ||
|
ea0b6a0cd5 | ||
|
f015b5b820 | ||
|
6d3810b7ba | ||
|
e273b04dab | ||
|
9799fb5e3f | ||
|
c27a0e1aea | ||
47ee6edaad | |||
b8d2af4c67 | |||
|
8faa0d9f4e | ||
|
9ef0739b80 | ||
|
ad7f3d6167 | ||
|
78dfb230ed | ||
|
854a4ca010 | ||
|
7fde2eb9cd | ||
8c6d98ddbd | |||
c2229a6c79 | |||
|
120abce028 | ||
|
a6d6f2bea2 | ||
|
3f6a95f7a6 | ||
|
090f650ac1 | ||
|
06109eb0c4 | ||
|
f6938b2f13 | ||
|
9467525dac | ||
|
1914b23c74 | ||
|
e333ff3d27 | ||
|
a5b7002239 | ||
|
9faf346634 | ||
|
67a0db5349 | ||
|
e5b8c84736 | ||
|
090383bc95 | ||
|
52107afc1a | ||
|
3b9ded0b29 | ||
c51a3ee5a1 | |||
ba9c01b82c | |||
|
132ca02cdf | ||
|
9cd082b878 | ||
|
efbf92b012 | ||
|
ff1940cdc5 | ||
|
6a17db4e04 | ||
|
5a2e48eeef | ||
|
b9fd28f20f | ||
|
1a8f50adb0 | ||
|
31d602986e | ||
|
fb83027a1e | ||
|
19edc91dfd | ||
|
27a23f68c0 | ||
|
1306efd380 | ||
|
b19473f658 | ||
|
53c60eed76 | ||
|
1fae58c350 | ||
|
0c00a697ec | ||
|
7e8ea1cdbf | ||
|
a39d0fa6cf | ||
|
b40e1deb89 | ||
|
ee751b471d | ||
|
782e9895e5 | ||
|
8552881f7d | ||
|
9bfd6a29fb | ||
|
f5c80e7b5c | ||
|
d7a5c1d9c1 | ||
|
e66e0c1452 | ||
|
21daf749f0 | ||
|
1e46d6fabd | ||
|
8b34ca34c7 | ||
|
964e917f4a | ||
|
210e82e798 | ||
|
243fa1a1d9 | ||
|
506425a9e1 | ||
|
a72a602120 | ||
|
bcd2bb9242 | ||
|
a6e6993a65 | ||
054133e013 | |||
2d875ba623 | |||
|
e6f6fd7d38 | ||
792acd7b17 | |||
|
30d884b699 | ||
|
bc14d1f0ef | ||
|
062a4c1090 | ||
134bbb9984 | |||
|
a441bed2a2 | ||
|
f5ee6448e4 | ||
|
3e77eddb33 | ||
|
ad8c815b3c | ||
|
96724464e2 | ||
|
8f346ae0b7 | ||
|
8a47afef58 | ||
|
6768fe96c2 | ||
|
c4a47928a8 | ||
|
ec06357535 | ||
|
bb1b6c377c | ||
|
9c87fadb7d | ||
|
db7aa3d12a | ||
304de4ab71 | |||
|
3e5f589972 | ||
|
6fbee71173 | ||
07c015856e | |||
|
17b7bf6757 | ||
|
e0716bbeb2 | ||
|
4e4f0adfd6 | ||
|
a66e23fe9b | ||
80565efefb | |||
3a325ecc6c | |||
|
aa28272dbd | ||
|
097ec6ef1a | ||
|
2bdfebc428 | ||
|
5282e789ba | ||
|
b0aa66c7cf | ||
|
772aa904d9 | ||
|
459f75727a | ||
|
e2d4ab3715 | ||
|
80f5873d9a | ||
|
abdfa54f36 | ||
|
361e424acd | ||
|
7ac85ac412 | ||
|
80077be185 | ||
014a7fabcb | |||
a2fee28bba | |||
|
f7434502b7 | ||
|
a4361fe8ce | ||
|
48978fb060 | ||
|
03a8eab3d1 | ||
|
428c592139 | ||
|
dca7c2c520 | ||
|
c9c1ffca4e | ||
|
ad5554bb52 | ||
|
bf7642dab3 | ||
|
a63f4ced3d | ||
|
b896d43db7 | ||
|
f4b08ff0a3 | ||
|
c70764dab2 | ||
|
542b830577 | ||
|
bfe902e062 | ||
|
c205c9ff94 | ||
|
2d702f5542 | ||
|
d68b0bdb0c | ||
|
07b25a2fc3 | ||
|
a43d46f5f5 | ||
|
47851c9ed2 | ||
|
f82d42e729 | ||
|
c43fccf297 | ||
|
d446b9a78f | ||
|
1deebaff20 | ||
|
df66227729 | ||
|
bcbb02f52f | ||
|
f5470239e4 | ||
|
f8909d5e8c | ||
d27633fc28 | |||
|
6066b9312e | ||
|
fe0d2f2760 | ||
|
2c0d88c4d5 | ||
|
2c9a6830c8 | ||
|
6b3b5d6fec | ||
|
b4ab5d8cd1 | ||
|
bffc2fd799 | ||
|
3f36afc285 | ||
|
18e9cf7039 | ||
|
43f7df6c76 | ||
|
03328b9293 | ||
|
3dd80070c7 | ||
|
3984c260b0 | ||
|
82a4d7a2a2 | ||
|
3b43090bda | ||
|
f0c4299ba3 | ||
|
f10079497c | ||
|
07fc4a3666 | ||
|
38bc096444 | ||
|
146c4b7ac1 | ||
|
9d854e9642 | ||
|
6e200bf956 | ||
|
b3c9a02660 | ||
|
22699f1ed5 | ||
|
c0232e6fce | ||
|
96c9bf2a93 | ||
|
b5020645be | ||
|
bf483e4abc | ||
|
a37018aab6 | ||
|
be7d49c0f5 | ||
|
336d8c1faa | ||
|
ab942731e6 | ||
|
168336a20b | ||
|
297377b0fd | ||
|
65d7cb3823 | ||
|
1d9a837e37 | ||
|
05f5a606d1 | ||
|
614f02a108 | ||
|
32a134f31a | ||
|
4ae850d529 | ||
|
3f27aea2ea | ||
|
30da4ae75e | ||
|
b7bf41a191 | ||
|
38769615ac | ||
|
6cc94bcb33 | ||
|
7f6a9c6513 | ||
|
7e371a20d9 | ||
|
28270d7d18 | ||
|
d6084f035f | ||
|
816323a154 | ||
|
0a3207e879 | ||
|
7af300b8f5 | ||
|
9753081407 | ||
|
c83fd59763 | ||
|
445a5866ad | ||
|
f070a121fe | ||
|
c2f0fb24c3 | ||
|
7eea7c09d4 | ||
|
6263f3a2f4 | ||
|
ada83c629a | ||
|
1dea407037 | ||
|
b83cb193f1 | ||
|
5ad1044dc0 | ||
|
09b3d77b19 | ||
|
7ce1add5dc | ||
|
34341ef01c | ||
|
1aec37b6f6 | ||
|
9b05509ec4 | ||
|
53450ea9d6 | ||
|
60bd21bf42 | ||
|
d05fe335b8 | ||
|
55b1476139 | ||
|
de1d5d6d51 | ||
|
e61b91dd5e | ||
|
1814298f4f | ||
|
5c52ec61da | ||
|
86f6d6429e | ||
|
31c4afe751 | ||
|
a34cb53e91 | ||
|
2dca8f236e | ||
|
55b7b28eb1 | ||
|
919c71a1c1 | ||
|
2d5d4b0e46 | ||
|
2703f72de8 | ||
|
7f071cbe80 | ||
|
55587f67fe | ||
|
ae7ee06031 | ||
|
3fbc5fa262 | ||
|
397786991d | ||
|
1a82e11b5e | ||
|
71d2b234c6 | ||
|
f8d4d074d5 | ||
|
6ac121bc01 | ||
|
452446a375 | ||
|
dcd17ed01c | ||
|
8eaf93a916 | ||
|
0d1efa5a87 | ||
|
d92b88b65a | ||
|
aee1aa6904 | ||
|
5dafbd2997 | ||
|
54b4814389 | ||
|
d01bd8a080 | ||
|
3081dcc8db | ||
|
c86d7569f3 | ||
|
e8b35a6971 | ||
|
3339153ad3 | ||
|
ed6252bb38 | ||
|
01e2d8f2a7 | ||
|
dd71e6bc70 | ||
|
46ee9df63a | ||
|
922edc96d7 | ||
|
a671caeb79 | ||
|
3088481d6d | ||
|
00bba6c05a | ||
|
5b09b3e52c | ||
|
3772274ca3 | ||
|
7ce4d812bd | ||
|
2ed44e874c | ||
|
9898fb0cbe | ||
|
bc45a6d3be | ||
|
e320dcd1bb | ||
|
54840e96ad | ||
|
406e11a38e | ||
|
a61b48252c | ||
|
952ebf8b9d | ||
|
b6d472d62f | ||
|
0cd01e2c03 | ||
|
c3956be558 | ||
|
6e6920851d | ||
|
022fe7d6f4 | ||
|
ba103d5636 | ||
|
a2e2f1b194 | ||
|
e514b1590b | ||
|
2bb6899c33 | ||
|
cb4bd3acaa | ||
|
fa615bc2e0 | ||
|
957e67686a | ||
|
911487871d | ||
|
c397a953a1 | ||
|
e7b0201e0a | ||
|
340c0f9213 | ||
|
db4e8ee0db | ||
|
95caad6b59 | ||
|
ae9de7aa92 | ||
|
ce6761755e | ||
|
6154992f4f | ||
|
0b9fdeceb8 | ||
|
34017d54db | ||
|
aa12eceeea | ||
|
9805b4bb18 | ||
|
333f769a16 | ||
|
75276ab2da | ||
|
814869ec77 | ||
|
3f3abb4255 | ||
|
55a33cf012 | ||
|
accfbe0acd | ||
94c1859a01 | |||
|
bbf1cec98c | ||
|
ff72960382 | ||
|
61ee2d0af6 | ||
|
933d03e45a | ||
|
86085a0c31 | ||
|
7c969e495e | ||
|
97ab17ce7a | ||
|
58959cf866 | ||
|
7201dfd113 | ||
|
a314bca69b | ||
|
cb98a6fc94 | ||
|
f107ae4556 | ||
|
3a3b7f362b | ||
|
ff917b25ad | ||
|
dfbbc11cfb | ||
|
7c1e123ad6 | ||
|
84094ad38b | ||
|
5a3a4d959f | ||
|
83f6c31dd6 | ||
|
e5031f9987 | ||
|
0253f8e67e | ||
|
c207f0507d | ||
|
6ceecb42aa | ||
|
f8bd639f39 | ||
|
cf6e7f625a | ||
|
cbc119382b | ||
|
c08ab3a456 | ||
|
09c7b15656 | ||
|
5ee217accb | ||
|
eba2eadaca | ||
|
7021cb983e | ||
|
37cc5cb178 | ||
|
a5d7c6ccd4 | ||
|
766be1f051 | ||
|
f61ef23e3f | ||
|
896e0d924b | ||
|
1c1d479474 | ||
|
ee492a0c23 | ||
|
da54de32b9 | ||
|
4ba7804b88 | ||
|
928328f2b0 | ||
|
730dd2f2df | ||
|
8b1b38dddc | ||
|
57770e76cf | ||
|
aad2f6a34f | ||
|
3802e1bf0f | ||
|
c9e7971c41 | ||
|
e97f3d1fbf | ||
|
21c0ee9134 | ||
|
96df4dc857 | ||
|
c32628e2b2 | ||
|
df4b6f214e | ||
|
f0f41cbfb6 | ||
|
e9f480e3ef | ||
|
82a3cb7dd5 | ||
|
34a8a2eee4 | ||
|
e6b9635e22 | ||
|
154e891cb4 | ||
4fc223a6a6 | |||
|
22a34c3315 | ||
|
51e076aafc | ||
|
46a8345de2 | ||
|
17d7014da9 | ||
|
7128870ef6 | ||
|
48408c6547 | ||
|
3ca9395d69 | ||
|
95d2593b28 | ||
|
02874adbd0 | ||
|
f583aa6439 | ||
|
547cd5abb6 | ||
|
51fcdcd1a5 | ||
|
58aec22fc3 | ||
|
ac55ecc545 | ||
|
f8b5cdafa2 | ||
|
5feb4535d6 | ||
|
6d90246bbe | ||
|
c086ba176f | ||
|
c2aeeb07f9 | ||
|
a9cd400834 | ||
|
4594619a4a | ||
|
668e724a01 | ||
|
cabdaed21d | ||
|
38bdf1318f | ||
|
4ccd67e28a | ||
|
6cdfb4a7bc | ||
|
a99a839998 | ||
|
ef5c919803 | ||
|
fdfb945ed0 | ||
|
bee65e50f7 | ||
|
324f5bf94e | ||
|
a8e98c1e08 | ||
9e08c6f2a5 | |||
|
074f4652d1 | ||
|
650faf25f6 | ||
|
4670851505 | ||
|
48bcea8f65 | ||
|
2ddae8e300 | ||
|
d04f703f35 | ||
|
86f8cb5100 | ||
|
c4592d242a | ||
|
6a1ac9ada4 | ||
|
62b8b3ceff | ||
|
4f49920526 | ||
|
1a60aeac2e | ||
|
1a3062f2f9 | ||
|
14e709be37 | ||
|
5636b1ab3d | ||
|
67383cf052 | ||
|
2ba5c0e9b3 | ||
|
2af3df4bc6 | ||
|
e4829b9c04 | ||
|
a63215f299 | ||
|
cca081b5c7 | ||
|
803863571b | ||
|
e3e25f78d7 | ||
|
7ce675da86 | ||
|
f33c686aab | ||
|
bdd7d31bd5 | ||
|
6ae53d90af | ||
|
217ccb9e09 | ||
|
8a79393989 | ||
524302fb2e | |||
|
dadbe36bd2 | ||
|
0f9e49a1ce | ||
|
991422fef4 | ||
|
b5e502c647 | ||
|
5688f81904 | ||
|
0a82b6933e | ||
|
0820dc9997 | ||
|
93cfdc3ed1 | ||
|
3bb795a793 | ||
|
99a4ca6192 | ||
|
b84a6b1855 | ||
|
8384a58118 | ||
|
037b823db9 | ||
|
edef518da3 | ||
|
1bfbb5c243 | ||
|
232fde0a73 | ||
|
93eeeafd3c | ||
|
af112aa72b | ||
|
8dbc46145c | ||
|
184e6ccdc3 | ||
|
42c1d4e340 | ||
|
2ab669ba3a | ||
|
eb078a0b73 | ||
|
4649a0d3dc | ||
|
1a599a6af3 | ||
|
5337d899d4 | ||
|
c3685f3aad | ||
|
feff032c31 | ||
|
ef958483bb | ||
|
dfeadec80b | ||
|
f66bab2dd2 | ||
|
27ed59eb08 | ||
|
c9a81dd174 | ||
|
fe40fd57ae | ||
|
53fbb8e6e7 | ||
|
904f7d1109 | ||
|
7edc74b253 | ||
|
2f82594a60 | ||
|
791abc1c2b | ||
|
1f899a3d80 | ||
|
1a3982d1b7 | ||
|
64c626ffdb | ||
|
c454ec6d98 | ||
|
70c77762a2 | ||
|
7309244ccf | ||
|
fa5bf90195 | ||
|
f34ddb1060 | ||
|
561c512a9b | ||
|
bde9f2eb00 | ||
|
47880fa951 | ||
|
56357c4d40 | ||
|
ec2574d707 | ||
|
7c183fbe73 | ||
|
3f60187158 | ||
|
5193574f68 | ||
|
d9e41240a4 | ||
e9924db3a2 | |||
|
96efd0f194 | ||
|
99cccc9d2f | ||
|
af3aa7afec | ||
|
44119fba90 | ||
|
12cb4f014a | ||
|
91b46e23aa | ||
|
2bb02b6e13 | ||
|
ef0f43d7e4 | ||
|
49469f6aaf | ||
|
12634894ac | ||
|
a2383a2702 | ||
|
ddd7498016 | ||
|
4ecec3a3ab | ||
|
3bb7507fe5 | ||
|
7410a0019b | ||
|
8105bfaa1e | ||
|
9ddaba0b4c | ||
|
090166b780 | ||
|
98fe748bef | ||
|
24c50487d2 | ||
|
2da623dfb3 | ||
|
390391d117 | ||
|
80f1fbbce7 | ||
|
1a628d39f7 | ||
|
66a68d0f23 | ||
|
457045d81a | ||
|
3346a0c90f | ||
|
b75f693454 | ||
|
7b6604fba2 | ||
|
5244480d4c | ||
|
6c9734648a | ||
|
44ca9e2a2e | ||
|
e886e7dc33 | ||
|
e31b03ccdf | ||
|
7ceb242814 | ||
|
4ff92e7f5c | ||
|
b6ee459833 | ||
|
f7dd6a8d72 | ||
|
0cdf90e24a | ||
|
94ab0b8b07 | ||
|
1163023062 | ||
|
65a9e7c9e8 | ||
|
c3fd4941fe | ||
|
36e06aec16 | ||
|
f5cb3ec179 | ||
|
090ebdb332 | ||
|
a05f966cfd | ||
|
335cdc6055 | ||
|
6a5b962f01 | ||
88ff761876 | |||
eefd9ece11 | |||
|
078bf1c1fc | ||
|
037d69bccb | ||
eb062a2424 | |||
0619cdc9c1 | |||
15739dd410 | |||
|
e458257c65 | ||
|
3d8fa75d59 | ||
|
f4268b53cf | ||
|
dfca800514 | ||
|
862d94d35d | ||
af08dd1b43 | |||
6c3c70024d | |||
edc7838128 | |||
|
46e329471c | ||
|
3373095a66 | ||
|
3ea2da1ad2 | ||
|
8969b71613 | ||
|
ae92fe1514 | ||
|
36b817ac58 | ||
|
9527ef632f | ||
|
af45d34721 | ||
|
c39131199d | ||
|
e4cce9618e | ||
|
4d45e57a9b | ||
|
16749fec8c | ||
|
8a4da51366 | ||
|
2568072c0e | ||
|
8c9e361918 | ||
|
55c1565f66 | ||
|
9f70aa80d2 | ||
|
9fb205bc2b | ||
|
1af5e68bd0 | ||
|
b674060ddf | ||
55dff20bc1 | |||
|
a3f76b3369 | ||
a8e84342b9 | |||
|
42e32bb7a7 | ||
|
f4129ff8ee | ||
|
938c4cbd69 | ||
619a5c4ecf | |||
|
ff0e1060e9 | ||
|
ad20c781a5 | ||
|
278f9e65ac | ||
|
d6d4e36640 | ||
|
4f5207858f | ||
|
d06e4a1d48 | ||
|
bd1096760b | ||
|
6bd729e859 | ||
|
5ef2495ee3 | ||
525243bd8d | |||
a17583c599 | |||
|
2630786cc1 | ||
|
86f2c59faa | ||
|
00e7f3eb40 | ||
|
ae1b1dfbb1 | ||
|
8e01325cad | ||
|
3e01b98388 | ||
|
797fc7a3c0 | ||
|
e3fe5b8022 | ||
|
d342a4ca9a | ||
|
64e96c1c30 | ||
cd51a360df | |||
|
d7153a4bf1 | ||
|
b399cf74e9 | ||
|
9718ab4ec1 | ||
4f3c9af3c4 | |||
df448fbaf5 | |||
88694193b4 | |||
|
e76ded074c | ||
|
f483c90ee2 | ||
|
7042f3dd9e | ||
|
a93517dcf1 | ||
|
1106a510da | ||
|
4dac50301d | ||
|
3762bd4906 | ||
|
d41f8547db | ||
|
75349a34b5 | ||
|
b10408b631 | ||
bac1404cf1 | |||
|
1c9430286c | ||
|
c7d87ac5c8 | ||
|
e6c055e782 | ||
|
35605b5af3 | ||
|
8db2b94203 | ||
|
09411a4b32 | ||
|
049dff0952 | ||
|
7374d5f752 | ||
|
f809557679 | ||
|
18a2718888 | ||
|
3e7578411b | ||
|
456e329232 | ||
|
a15b37d9ea | ||
|
813f27c4d2 | ||
|
11462e76ef | ||
|
8057b40bb3 | ||
|
b40f1e2e51 | ||
|
06991af115 | ||
|
4e3593375f | ||
|
b0c7cd350f | ||
|
0e2fbf3cf1 | ||
|
787f446c31 | ||
|
943afd00d1 | ||
|
bc33e32ea4 | ||
22e055d5e8 | |||
|
cf25dbfdf8 | ||
|
35aa8c4023 | ||
|
4ef272a337 | ||
|
bbb5072130 | ||
|
388179bf0b | ||
|
6faef577e1 | ||
|
1a8035af4f | ||
|
0299f597ff | ||
|
782aee16b2 | ||
|
2e492ebd7d | ||
|
1092d60f79 | ||
|
1f4414ba4f | ||
|
f23f07b05c | ||
|
5178462d64 | ||
|
bd61854a10 | ||
|
1af0045997 | ||
|
cb3e2ea468 | ||
|
c92e0096dd | ||
|
16eac2f8c4 | ||
|
ad20a18317 | ||
|
9069570f0b | ||
|
f467c35bd3 | ||
|
8fe93ec779 | ||
|
db710b9e06 | ||
|
3a01ec4d26 | ||
|
2c28a620b9 | ||
|
75703ecadd | ||
|
2b2139687a | ||
|
869ce50f31 | ||
|
16d48592cc | ||
|
414b5c6b60 | ||
|
5a7c5aefb9 | ||
|
597dc2a91a | ||
|
6658e9e5c3 | ||
|
e3cd96c758 | ||
|
3315068a30 | ||
|
b8fa2dc338 | ||
|
96447cedc1 | ||
|
e7261672cc | ||
|
f41546b1fd | ||
|
173eff33c1 | ||
|
06ee0e9c3c | ||
|
66c4355ee0 | ||
|
409c455bd1 | ||
|
bb4e935303 | ||
|
9598f0db42 | ||
|
522aed6a5e | ||
|
dea6f80d24 | ||
|
ee003d6336 | ||
|
25c267f3df | ||
|
2e8479383e | ||
|
652917cbdf | ||
|
667fb0e290 | ||
|
10aa1a8da0 | ||
|
3d09666c68 | ||
|
540b9aab74 | ||
c46be46bb8 | |||
c495135e56 | |||
|
87c5569dab | ||
|
92f14d52f3 | ||
|
7e188d1b05 | ||
|
21a38d8b00 | ||
|
15b494a2ac | ||
|
8c0dca3df7 | ||
|
aa3435bfd7 | ||
|
f0f612b11a | ||
|
0f17cac626 | ||
|
a89a076db9 | ||
|
4b28412648 | ||
|
db2f3367dd | ||
|
c70ad9e6a2 | ||
|
921f382c6a | ||
|
9e82414728 | ||
|
f4702e5381 | ||
|
94d5689077 | ||
|
3ad8bfb380 | ||
|
3337aa8bb8 | ||
|
bb5fa8db5b | ||
|
f70b40f112 | ||
|
1e396a5328 | ||
|
c3f902bfe6 | ||
|
450f3e5d35 | ||
|
c20f285ca7 | ||
|
30100a5a31 | ||
|
47b61f05c0 | ||
|
5670b19fab | ||
|
27f3346435 | ||
|
8d3dcacded | ||
|
825da2027f | ||
|
ca0a4274dc | ||
|
cab8caac90 | ||
|
7bb7a388b8 | ||
|
b5778a8be2 | ||
|
26b2d74cc4 | ||
|
128d387ebe | ||
|
98502d9e93 | ||
|
93f5b82dec | ||
|
a5ec847ed1 | ||
|
57d72e95d0 | ||
|
42ff39f4d9 | ||
|
41f1e0a3bc | ||
|
c6b03cfe55 | ||
|
d47903a912 | ||
|
489cae7122 | ||
|
0720df1a2e | ||
|
ff5c620a29 | ||
|
69304a0c71 | ||
|
f49b53f9d6 | ||
|
c2336a753e | ||
74c448d0d0 | |||
|
08bb694753 | ||
|
4ef067118b | ||
|
e291836523 | ||
|
5b964974cd | ||
|
02cda0c1f4 | ||
|
2a1825303a | ||
|
03797744e2 | ||
|
7b83f8ca6f | ||
|
6da2a33ce3 | ||
|
c1ae7b8eb9 | ||
|
e42c3feaa7 | ||
|
83b029e3b9 | ||
|
3feb32d6c9 | ||
|
155c858fd6 | ||
|
f2f4f7bb12 | ||
|
ee834e6621 | ||
|
a2451c0575 | ||
|
e53314f403 | ||
|
1396cbc25f | ||
|
94815071c0 | ||
|
29dd1e8c72 | ||
|
b03e1de0a9 | ||
|
5661cb318d | ||
|
3d907f260e | ||
|
d9530d1590 | ||
|
9c0348cce3 | ||
|
175686aded | ||
|
ab56e6f35b | ||
|
ab52444bfd | ||
|
4aff809fcb | ||
|
3f667e8fa6 | ||
|
70699aeecd | ||
|
56c163f6a9 | ||
|
f48f50e09e | ||
|
24f7bb5a66 | ||
|
12f5b7dbd3 | ||
|
10b8d4b2e4 | ||
|
43077feb01 | ||
|
e6c21582f8 | ||
|
cccfb7eac8 | ||
|
532a08763f | ||
|
bd5d6a277d | ||
|
a033d72f20 | ||
|
98c96a7c81 | ||
|
c76dbeab05 | ||
|
22c222d3cc | ||
|
8256aea4cd | ||
|
4ea034e92e | ||
|
9f82089d61 | ||
|
5714193eeb | ||
|
086c163db1 | ||
|
c9ab51dbb2 | ||
|
45a70affce | ||
|
881c3a0f81 | ||
|
3fc3544f23 | ||
|
3627e79fe0 | ||
|
b9cf71c6b0 | ||
|
4c51930c25 | ||
|
d406f720d8 | ||
|
b4ba38d770 | ||
|
58b89f7ae4 | ||
|
5d117fa66c | ||
|
94f9d71a66 | ||
|
2905446030 | ||
|
87d993da35 | ||
80d500413d | |||
638757879c | |||
64254875f8 | |||
a749b8c000 | |||
62bb63242b | |||
5e28bc91ea | |||
3215cad462 | |||
5e3eacbb69 | |||
ecb95933aa | |||
f739935096 | |||
35cd7c6e67 | |||
5fd1b69135 | |||
88c13f7d7c | |||
0792bf98bd | |||
58e8dcd5f6 | |||
a6d1008242 | |||
7e4a380320 | |||
a4449482e3 | |||
7b5caf0e8d | |||
5a47fa8074 | |||
b2f43076aa | |||
a2bfeb72a7 | |||
12c3e2d60d | |||
4345070720 | |||
7f4b1fa9cc | |||
bad9918b98 | |||
255ac6220c | |||
0fc7477672 | |||
24f1a64fca | |||
5de084e63e | |||
8be55e86d7 | |||
d73922358f | |||
5cb3a50642 | |||
4873d03d42 | |||
c34ce4c17e | |||
f1e3006b45 | |||
b5d74330fe | |||
5a1c3bf5c8 | |||
401185b953 | |||
|
f133155798 | ||
d310943b0e | |||
eaba2fb708 | |||
a2f78ea9f3 | |||
2f42366d0a | |||
|
f7f54f8754 | ||
|
90e644e9eb | ||
|
a2b662e2ce | ||
7016a45312 | |||
|
2562abdf4b | ||
a0a17e6076 | |||
853fecc4a0 | |||
d62109d72b | |||
bf860a32ac | |||
|
2565789af7 | ||
|
77023f6400 | ||
|
a899cc2dff | ||
|
ab8a889464 | ||
|
3c740457f3 | ||
|
6609bf4b16 | ||
|
f4f4e25798 | ||
|
cbe589f5b7 | ||
|
caa90f9f9c | ||
|
862e23e79c | ||
|
bc5c274c8f | ||
|
37159eae3b | ||
|
f96df5ec61 | ||
|
827d9a0b8d | ||
|
142d9edb20 | ||
|
b41405ea09 | ||
|
1a0b315365 | ||
|
dae493b1a8 | ||
|
13c577d2ae | ||
|
48ecf35f1a | ||
|
fb6517dc9f | ||
|
aa38622b8d | ||
|
248847436b | ||
|
be536272ca | ||
|
77a3af4d11 | ||
|
7644b9b07c | ||
|
e01a75faea | ||
|
b89e838625 | ||
|
62a2176aaa | ||
|
734c68a022 | ||
|
cef80ad20b | ||
|
475d0e22ae | ||
|
08617d41c6 | ||
|
b33ccc4a84 | ||
|
18e6862949 | ||
|
97a76cbd69 | ||
|
d70ed401cb | ||
|
644cec05cb | ||
|
3fc6218332 | ||
|
bc287f0e11 | ||
|
545ff7db87 | ||
|
1480519bb2 | ||
|
f7d6971849 | ||
|
43d731cf72 | ||
|
3994b924de | ||
|
a2db90289a | ||
|
b3c77aa972 | ||
|
11d726867c | ||
|
8b025cf8bd | ||
|
29baaa700c | ||
|
9424e48c74 | ||
|
d86191d4af | ||
|
c64c1a441d | ||
|
52f00cbe59 | ||
|
5a3b2916d1 | ||
|
6a477d39f0 | ||
|
aa3741a9fa | ||
|
5c8464520c | ||
|
18dd2c01e4 | ||
|
49894f7d9e | ||
|
1cde50242d | ||
|
1a4d8e809d | ||
|
7c648ce829 | ||
|
d77047f62c | ||
|
e6a5f9712d | ||
|
ba2ede20aa | ||
|
663c9119e6 | ||
|
d3b254fc82 | ||
|
7bf20e29e7 | ||
|
289fb76906 | ||
|
a7ce1ff704 | ||
|
c8039ec248 | ||
|
b337c689b9 | ||
|
6ad1828079 | ||
|
67de68b28b | ||
|
8914f01b3b | ||
|
ff3bfa545f | ||
|
dfd3b9e615 | ||
|
78037e60a3 | ||
|
57eb898bfd | ||
|
fa33342dbc | ||
|
3594485267 | ||
|
00d668a74a | ||
|
67216c0a83 | ||
|
081c4a88a2 | ||
|
2d08fda940 | ||
|
a23d9fa216 | ||
|
a31cdfce24 | ||
|
935ad85fd5 | ||
|
6954c598a3 | ||
|
3c20e8cf5c | ||
|
5483483031 | ||
|
688591b616 | ||
|
df38a1860f | ||
|
48d0159a92 | ||
|
c7182e840d | ||
|
8ceb695d43 | ||
|
d14a778831 | ||
|
545bb19896 | ||
|
5798c2399d | ||
|
438824fa36 | ||
|
441316b9f5 | ||
|
58fd82ca36 | ||
|
803f2ba075 | ||
|
db1b51ae8a | ||
|
2f89219756 | ||
|
e320d0e84f | ||
|
9e9dbf8e2a | ||
|
cf412e049f | ||
|
d7c3e297ed | ||
|
8869a560ed | ||
|
71c327f14c | ||
|
0f0743bd52 | ||
|
0b5c5d5aba | ||
|
a3c6141ab7 | ||
|
3804d26cab | ||
|
88fffc078b | ||
|
f1803662a8 | ||
|
3c080e4725 | ||
|
23ac4ef88a | ||
|
4d9c33ed1c | ||
|
ff92bca633 | ||
|
1cf83dcd34 | ||
|
7091d7b326 | ||
|
a32cf9128b | ||
|
97ca21d295 | ||
|
4b7614caec | ||
|
6c1852e094 | ||
|
4f47218a13 | ||
|
a4d12d7b65 | ||
|
33f30bd1c6 | ||
|
e7f8779ba8 | ||
|
2a3a9dec9d | ||
|
a570ed75d0 | ||
|
9436b486f9 | ||
|
f72a0187be | ||
|
ba7eb96e8a | ||
|
709623dfc5 | ||
|
8fc9b85bfa | ||
|
d2805afc9f | ||
|
faac427cc7 | ||
|
372bae4203 | ||
|
9cde3262d6 | ||
|
fead1b65a1 | ||
|
f77021b82b | ||
|
2c9e65b518 | ||
|
0cfd1df846 | ||
|
54d5cbdce8 | ||
|
71a0330a0b | ||
|
691ce8986c | ||
|
d2b3fe7746 | ||
|
1a79be3970 | ||
|
f28e65f0cf | ||
|
037135cf71 | ||
|
f904f05dc9 | ||
|
b8b73e82fe | ||
|
23812038d9 | ||
|
5d0ac36fa4 | ||
|
e4844832f1 | ||
|
8f1db81e83 | ||
|
dc25058a05 | ||
|
f3ea7d790b | ||
|
2f5998843e | ||
|
eec1d1a352 | ||
|
dee2f2ada7 | ||
|
48cc52cf72 | ||
|
aaf3bafb02 | ||
|
d24daf52eb | ||
|
d357e505c9 | ||
|
d065656ff5 | ||
|
7d0a71da64 | ||
|
3fc81ec53e | ||
|
758c727c45 | ||
|
a6006211f2 | ||
|
d2018e1863 | ||
|
52e5075989 | ||
|
67e901d3d0 | ||
|
0054423407 | ||
|
bf564e55ef | ||
|
9a86a61c99 | ||
|
fdd7ff70b1 | ||
|
be0e643c57 | ||
|
d19f6814da | ||
|
f2bd65cae3 | ||
|
3baf24269f | ||
|
185be59862 | ||
|
c2f3993fc1 | ||
|
b96c9d0a2c | ||
|
d4e51d3dfd | ||
|
e731d9869e | ||
|
606de23f8d | ||
|
219aa4c9b1 | ||
|
62728e608d | ||
|
503c17352c | ||
|
b4f99c1c18 | ||
|
526d5ad4ae | ||
|
37de991028 | ||
|
0cdd55cdf8 | ||
|
74ebf724cc | ||
|
30b056108f | ||
|
630bf80f07 | ||
|
6b9f2bd789 | ||
|
d2531a526d | ||
|
a0161a2c72 | ||
|
7e70d5b14b | ||
|
dd79c9aa21 | ||
|
2a656a58d5 | ||
|
1ecda26d3d | ||
|
88244a7b09 | ||
|
0e260d1aaf | ||
|
d9d01ed7e0 | ||
|
edef539707 | ||
|
ad4f4e8d8e | ||
|
abac28fa46 | ||
|
1f3e727c17 | ||
|
e1368a3f87 | ||
|
16162499cf | ||
|
9b54eea039 | ||
|
d3be5cc087 | ||
|
71b1b70528 | ||
|
62aa4c4639 | ||
|
0f78be2194 | ||
|
e4f172e715 | ||
|
fca7c3c7cd | ||
|
0808bb5ba6 | ||
|
a40ec07b59 | ||
|
1524f0899a | ||
|
4a23ae7dc4 | ||
|
6172334090 | ||
|
7f35a7488b | ||
|
9e01c73cae | ||
|
46ce6f2a91 | ||
|
de68b862da | ||
|
a300b99171 | ||
|
0933263cc9 | ||
|
a650a35dd6 | ||
|
95bc033817 | ||
|
4f199b2f26 | ||
|
2695ef98b6 | ||
|
72e58f0959 | ||
|
47ccc46359 | ||
|
053837d069 | ||
|
1565458c26 | ||
|
f085fbc767 | ||
|
35162b8906 | ||
|
da50f6f6d9 | ||
|
9587ff9b5b | ||
|
64d7650e54 | ||
|
e45a3e489f | ||
|
9037f69c09 | ||
|
092e9c2dcf | ||
|
2d7676fdf6 | ||
|
7c661b11c6 | ||
|
498a34ae19 | ||
|
a310180709 | ||
|
14eed1072d | ||
|
3f39164db1 | ||
|
4102ce00f3 | ||
|
c1b633843f | ||
|
38668789b9 | ||
|
f5a970e50f | ||
|
4cfac7bbef | ||
|
edb40a06d3 | ||
|
727625dfc8 | ||
|
72d0c3b0a4 | ||
|
d53e1d8020 | ||
|
83636a02ef | ||
|
36c8e6c042 | ||
|
56a50c9df4 | ||
|
ec5ba068bb | ||
|
5ff3a7656d | ||
|
c61789c2d7 | ||
|
53e9400dde | ||
|
30cb668a73 | ||
|
f1224a98ee | ||
|
1528c610d7 | ||
|
c26fc8bb26 | ||
|
bebe603a9b | ||
|
0b2a379dd8 | ||
|
898ecc3055 | ||
|
f553f42460 | ||
|
69477cea8d | ||
|
8f87a017a1 | ||
|
f81dad7eae | ||
|
50283a0b21 | ||
|
2ba492d94f | ||
|
9d19afcdf2 | ||
|
37b8fa7243 | ||
|
7b6a433ae6 | ||
|
24ecf02e7b | ||
|
1d4cac01d1 | ||
|
7e49da1999 | ||
|
1613a1052e | ||
|
5c7d525871 | ||
|
a9380cf307 | ||
|
159a8aa0df | ||
|
69e08359c2 | ||
|
4aa44861b4 | ||
|
6247d20f95 | ||
|
de2f60bfdc | ||
|
551be06d9e | ||
|
f720da79d0 | ||
|
03ffd84e76 | ||
|
1a963cff00 | ||
|
ce82496013 | ||
|
89c61a5571 | ||
|
29d7f891da | ||
|
17b4327dfb | ||
|
b3d7a7a124 | ||
|
92019f99a4 | ||
|
0861fd73d2 | ||
|
4db2ce5175 | ||
|
031dbdc2b2 | ||
|
31d689aa0d | ||
|
57f1b175b1 | ||
|
e5ed85ed3f | ||
|
fd108b1334 | ||
|
077eac1c53 | ||
|
3ec23b5ae5 | ||
|
8a88f48d89 | ||
|
2752ce5c25 | ||
|
6c6a26225f | ||
|
b0225eadeb | ||
|
344299805c | ||
|
41d40e3c04 | ||
|
2f18eb65b1 | ||
|
79c4da8b2c | ||
|
b2a0a6cebd | ||
|
e708282a8f | ||
|
58d015c247 | ||
|
fcba6ec6f4 | ||
|
460d2d96c2 | ||
|
31b6d96fc9 | ||
|
555898e446 | ||
|
5bd6f22cab | ||
|
69c54ba37c | ||
|
ba5259b36c | ||
|
91c5ca45ae | ||
|
c9ffa8291d | ||
|
f4e87f5303 | ||
|
17369b2f14 | ||
|
36547eeeca | ||
|
f54acb3ae5 | ||
|
63ab503077 | ||
|
69695e5c3f | ||
|
3f95a395c8 | ||
|
66a0d6ddca | ||
|
3e121c675f | ||
|
be696ee3da | ||
|
3929f26791 | ||
|
ac64783a29 | ||
|
3e4163cbfe | ||
|
12883cfbe2 | ||
|
466cc31f45 | ||
|
ae149896e7 | ||
|
214e52e5c2 | ||
|
3a337c3137 | ||
|
da790fc8d2 | ||
|
69463ded6b | ||
|
c948956779 | ||
|
7035c3feba | ||
|
cb77595747 | ||
|
423c1335f4 | ||
|
5e75270cd0 | ||
|
2d793bcb94 | ||
|
9e871ee587 | ||
|
1681690d27 | ||
|
00fd2b796c | ||
|
a53ff04192 | ||
|
5016eceae8 | ||
|
0fc5beb17a | ||
|
f9d39a8257 | ||
|
e07756c59f | ||
|
b006c39c40 | ||
|
6a594f7f72 | ||
|
354ffafa0b | ||
|
61c52eb127 | ||
|
a5243fa1f3 | ||
|
0802ce8993 | ||
|
4f16162665 | ||
|
fca74ed824 | ||
|
cf374158a8 | ||
|
ee756d06b9 | ||
|
35e6787a1e | ||
|
c490ea8523 | ||
|
82e40ddd84 | ||
|
678f54ca0c | ||
|
4e69fc957d | ||
|
87676a5cee | ||
|
eaaaff85c2 | ||
|
5f71deeb36 | ||
|
1f4582ab20 | ||
|
96c4727be2 | ||
|
7df57f5506 | ||
|
e17909854c | ||
|
6b18c2868a | ||
|
24deb150d2 | ||
|
6d87e5e1a6 | ||
|
4ae2ea9a65 | ||
|
743ebfb9de | ||
|
be3efcfad3 | ||
|
c119159be6 | ||
|
177c3f22a7 | ||
|
1ca18622c6 | ||
3864f97270 | |||
0b32b6a0d6 | |||
0aaed55634 | |||
e7d9e59f4d | |||
c6e5e23057 | |||
|
2876d9deed | ||
|
219b593b94 | ||
|
87064f2da4 | ||
|
169680eda7 | ||
|
450e970ed8 | ||
|
13554a8e43 | ||
8ebe7ce06f | |||
|
f2ab19036a | ||
|
2dc674e5d6 | ||
|
fbeba2a54f | ||
|
7bd3e21ca8 | ||
|
57f742a539 | ||
|
b2167895e6 | ||
|
04a096fea1 | ||
|
777b640f8e | ||
|
7569720a52 | ||
|
567f61d7ca | ||
|
108c2f7d5c | ||
|
1020716f6a | ||
|
81a8bb1d2b | ||
|
ef9e3c841e | ||
|
f6844739cf | ||
|
bcb3409cc5 | ||
|
a7950b3a4e | ||
|
49be184c50 | ||
|
6cf1baeace | ||
|
1da924416c | ||
|
12b0883686 | ||
|
856123de48 | ||
|
863de0057c | ||
|
82d4e79dc9 | ||
|
a923a3cfdc | ||
|
ef94a7eaf8 | ||
|
12e7d34929 | ||
|
7f31dfa2af | ||
|
65404ac1d2 | ||
|
b22f5456fc | ||
|
20701ad5da | ||
|
720c4472d3 | ||
|
863f6867c6 | ||
|
3e5834983f | ||
|
51f6af7ced | ||
|
5a3af46203 | ||
|
a47e66a6a6 | ||
|
1cd6926f4f | ||
|
6698601d19 | ||
|
b54cd674e6 | ||
11fa45cb19 | |||
b102988073 | |||
f0b8fd06c3 | |||
2a5b6015de | |||
d6ac8f443a | |||
0bb8eeab44 | |||
dc203af8a0 | |||
f3367271f5 | |||
|
e34b0d1c0d | ||
|
152c15dde4 | ||
|
b1d924c60a | ||
|
6e239bbf0f | ||
|
84f37eb14c |
50
.gitignore
vendored
@ -1,9 +1,55 @@
|
|||||||
src/.idea/workspace.xml
|
# IDE folders
|
||||||
|
.idea
|
||||||
|
|
||||||
src/mibew/install/package
|
src/mibew/install/package
|
||||||
src/absent_*
|
src/absent_*
|
||||||
src/release*
|
src/release*
|
||||||
|
src/upload*
|
||||||
|
src/*.po
|
||||||
|
|
||||||
|
# Do not index actual configuration files
|
||||||
|
src/mibew/configs/config.yml
|
||||||
|
src/tests/server_side/mibew/libs/config.php
|
||||||
|
|
||||||
|
# Do not index avatars
|
||||||
|
src/mibew/files/avatar/*
|
||||||
|
!src/mibew/files/avatar/.keep
|
||||||
|
|
||||||
|
# Do not index cache files
|
||||||
|
src/mibew/cache/*
|
||||||
|
!src/mibew/cache/.keep
|
||||||
|
!src/mibew/cache/.htaccess
|
||||||
|
|
||||||
|
# Do not index plugins
|
||||||
|
src/mibew/plugins/*
|
||||||
|
!src/mibew/plugins/.keep
|
||||||
|
|
||||||
# Do not index custom locales
|
# Do not index custom locales
|
||||||
src/mibew/locales/*
|
src/mibew/locales/*
|
||||||
!src/mibew/locales/en/
|
!src/mibew/locales/en/
|
||||||
!src/mibew/locales/names/
|
|
||||||
|
# Do not index composer files
|
||||||
|
src/composer.phar
|
||||||
|
src/composer.lock
|
||||||
|
|
||||||
|
# Do not index third-party libraries
|
||||||
|
src/mibew/vendor
|
||||||
|
src/mibew/js/vendor
|
||||||
|
|
||||||
|
# Do not index node.js modules that are used for building
|
||||||
|
src/node_modules
|
||||||
|
src/package-lock.json
|
||||||
|
|
||||||
|
# Do not index compiled js files of the core
|
||||||
|
src/mibew/js/compiled/*
|
||||||
|
!src/mibew/js/compiled/.keep
|
||||||
|
|
||||||
|
# Do not index compiled files of chat styles
|
||||||
|
src/mibew/styles/chats/*/templates_compiled/client_side/*
|
||||||
|
!src/mibew/styles/chats/*/templates_compiled/client_side/.keep
|
||||||
|
src/mibew/styles/chats/*/js/compiled/*
|
||||||
|
!src/mibew/styles/chats/*/js/compiled/.keep
|
||||||
|
|
||||||
|
# Do not index compiled files of page styles
|
||||||
|
src/mibew/styles/pages/*/templates_compiled/client_side/*
|
||||||
|
!src/mibew/styles/pages/*/templates_compiled/client_side/.keep
|
||||||
|
3
.gitmodules
vendored
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
[submodule "src/i18n"]
|
||||||
|
path = src/i18n
|
||||||
|
url = git@github.com:Mibew/i18n.git
|
12
ISSUE_TEMPLATE.md
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
### Environment
|
||||||
|
* Mibew Messenger version:
|
||||||
|
* OS:
|
||||||
|
* Web server:
|
||||||
|
* PHP:
|
||||||
|
* PHP extensions:
|
||||||
|
* MySQL:
|
||||||
|
### Expected behavior
|
||||||
|
|
||||||
|
### Actual behavior
|
||||||
|
|
||||||
|
### Steps to reproduce the behavior
|
8
PULL_REQUEST_TEMPLATE.md
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
Fixes # .
|
||||||
|
|
||||||
|
Changes proposed in this pull request:
|
||||||
|
-
|
||||||
|
-
|
||||||
|
-
|
||||||
|
|
||||||
|
@Mibew/core-developers
|
4
src/.bowerrc
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
{
|
||||||
|
"directory": "./mibew/js/vendor",
|
||||||
|
"analytics": false
|
||||||
|
}
|
27
src/.eslintrc
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
{
|
||||||
|
"extends": "eslint:recommended",
|
||||||
|
"rules": {
|
||||||
|
"indent": ["error", 4, {"SwitchCase": 1}],
|
||||||
|
"no-trailing-spaces": "error",
|
||||||
|
"semi": ["error", "always"],
|
||||||
|
"guard-for-in": "error",
|
||||||
|
"no-unused-vars": ["error", {"caughtErrors": "none", "args": "none"}]
|
||||||
|
},
|
||||||
|
"globals": {
|
||||||
|
"Mibew": true,
|
||||||
|
"MibewAPI": true,
|
||||||
|
"MibewAPIInteraction": true,
|
||||||
|
"MibewAPIChatInteraction": true,
|
||||||
|
"MibewAPIUsersInteraction": true,
|
||||||
|
"MibewAPIExecutionContext": true,
|
||||||
|
"Handlebars": true,
|
||||||
|
"_": true,
|
||||||
|
"Backbone": true,
|
||||||
|
"jQuery": true,
|
||||||
|
"vex": true,
|
||||||
|
"validator": true
|
||||||
|
},
|
||||||
|
"env":{
|
||||||
|
"browser": true
|
||||||
|
}
|
||||||
|
}
|
@ -1 +0,0 @@
|
|||||||
messenger
|
|
@ -1,31 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<project version="4">
|
|
||||||
<component name="ProjectCodeStyleSettingsManager">
|
|
||||||
<option name="PER_PROJECT_SETTINGS">
|
|
||||||
<value>
|
|
||||||
<option name="OTHER_INDENT_OPTIONS">
|
|
||||||
<value>
|
|
||||||
<option name="INDENT_SIZE" value="4" />
|
|
||||||
<option name="CONTINUATION_INDENT_SIZE" value="8" />
|
|
||||||
<option name="TAB_SIZE" value="4" />
|
|
||||||
<option name="USE_TAB_CHARACTER" value="true" />
|
|
||||||
<option name="SMART_TABS" value="false" />
|
|
||||||
<option name="LABEL_INDENT_SIZE" value="0" />
|
|
||||||
<option name="LABEL_INDENT_ABSOLUTE" value="false" />
|
|
||||||
<option name="USE_RELATIVE_INDENTS" value="false" />
|
|
||||||
</value>
|
|
||||||
</option>
|
|
||||||
<XML>
|
|
||||||
<option name="XML_LEGACY_SETTINGS_IMPORTED" value="true" />
|
|
||||||
</XML>
|
|
||||||
<codeStyleSettings language="PHP">
|
|
||||||
<indentOptions>
|
|
||||||
<option name="USE_TAB_CHARACTER" value="true" />
|
|
||||||
</indentOptions>
|
|
||||||
</codeStyleSettings>
|
|
||||||
</value>
|
|
||||||
</option>
|
|
||||||
<option name="USE_PER_PROJECT_SETTINGS" value="true" />
|
|
||||||
</component>
|
|
||||||
</project>
|
|
||||||
|
|
@ -1,13 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<project version="4">
|
|
||||||
<component name="Encoding" useUTFGuessing="true" native2AsciiForPropertiesFiles="false">
|
|
||||||
<file url="file://$PROJECT_DIR$" charset="UTF-8" />
|
|
||||||
<file url="file://$PROJECT_DIR$/mibew/locales/be/properties" charset="windows-1251" />
|
|
||||||
<file url="file://$PROJECT_DIR$/mibew/locales/bg/properties" charset="windows-1251" />
|
|
||||||
<file url="file://$PROJECT_DIR$/mibew/locales/ca/properties" charset="ISO-8859-1" />
|
|
||||||
<file url="file://$PROJECT_DIR$/mibew/locales/ru/properties" charset="windows-1251" />
|
|
||||||
<file url="file://$PROJECT_DIR$/mibew/locales/sp/properties" charset="ISO-8859-1" />
|
|
||||||
<file url="file://$PROJECT_DIR$/mibew/locales/ua/properties" charset="windows-1251" />
|
|
||||||
</component>
|
|
||||||
</project>
|
|
||||||
|
|
@ -1,11 +0,0 @@
|
|||||||
<component name="InspectionProjectProfileManager">
|
|
||||||
<profile version="1.0" is_locked="false">
|
|
||||||
<option name="myName" value="Project Default" />
|
|
||||||
<option name="myLocal" value="false" />
|
|
||||||
<inspection_tool class="SpellCheckingInspection" enabled="false" level="TYPO" enabled_by_default="false">
|
|
||||||
<option name="processCode" value="true" />
|
|
||||||
<option name="processLiterals" value="true" />
|
|
||||||
<option name="processComments" value="true" />
|
|
||||||
</inspection_tool>
|
|
||||||
</profile>
|
|
||||||
</component>
|
|
@ -1,7 +0,0 @@
|
|||||||
<component name="InspectionProjectProfileManager">
|
|
||||||
<settings>
|
|
||||||
<option name="PROJECT_PROFILE" value="Project Default" />
|
|
||||||
<option name="USE_PROJECT_PROFILE" value="true" />
|
|
||||||
<version value="1.0" />
|
|
||||||
</settings>
|
|
||||||
</component>
|
|
@ -1,15 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<module type="WEB_MODULE" version="4">
|
|
||||||
<component name="NewModuleRootManager">
|
|
||||||
<content url="file://$MODULE_DIR$" />
|
|
||||||
<orderEntry type="inheritedJdk" />
|
|
||||||
<orderEntry type="sourceFolder" forTests="false" />
|
|
||||||
<orderEntry type="module-library">
|
|
||||||
<library name="PHP">
|
|
||||||
<CLASSES />
|
|
||||||
<SOURCES />
|
|
||||||
</library>
|
|
||||||
</orderEntry>
|
|
||||||
</component>
|
|
||||||
</module>
|
|
||||||
|
|
@ -1,8 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<project version="4">
|
|
||||||
<component name="ProjectResources">
|
|
||||||
<default-html-doctype>http://www.w3.org/1999/xhtml</default-html-doctype>
|
|
||||||
</component>
|
|
||||||
<component name="ProjectRootManager" version="2" />
|
|
||||||
</project>
|
|
||||||
|
|
@ -1,9 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<project version="4">
|
|
||||||
<component name="ProjectModuleManager">
|
|
||||||
<modules>
|
|
||||||
<module fileurl="file://$PROJECT_DIR$/.idea/messenger.iml" filepath="$PROJECT_DIR$/.idea/messenger.iml" />
|
|
||||||
</modules>
|
|
||||||
</component>
|
|
||||||
</project>
|
|
||||||
|
|
@ -1,80 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<project version="4">
|
|
||||||
<component name="CodeStyleSettingsManager">
|
|
||||||
<option name="PER_PROJECT_SETTINGS">
|
|
||||||
<value>
|
|
||||||
<ADDITIONAL_INDENT_OPTIONS fileType="js">
|
|
||||||
<option name="INDENT_SIZE" value="4" />
|
|
||||||
<option name="CONTINUATION_INDENT_SIZE" value="8" />
|
|
||||||
<option name="TAB_SIZE" value="4" />
|
|
||||||
<option name="USE_TAB_CHARACTER" value="false" />
|
|
||||||
<option name="SMART_TABS" value="false" />
|
|
||||||
<option name="LABEL_INDENT_SIZE" value="0" />
|
|
||||||
<option name="LABEL_INDENT_ABSOLUTE" value="false" />
|
|
||||||
<option name="USE_RELATIVE_INDENTS" value="false" />
|
|
||||||
</ADDITIONAL_INDENT_OPTIONS>
|
|
||||||
<ADDITIONAL_INDENT_OPTIONS fileType="jsp">
|
|
||||||
<option name="INDENT_SIZE" value="4" />
|
|
||||||
<option name="CONTINUATION_INDENT_SIZE" value="8" />
|
|
||||||
<option name="TAB_SIZE" value="4" />
|
|
||||||
<option name="USE_TAB_CHARACTER" value="false" />
|
|
||||||
<option name="SMART_TABS" value="false" />
|
|
||||||
<option name="LABEL_INDENT_SIZE" value="0" />
|
|
||||||
<option name="LABEL_INDENT_ABSOLUTE" value="false" />
|
|
||||||
<option name="USE_RELATIVE_INDENTS" value="false" />
|
|
||||||
</ADDITIONAL_INDENT_OPTIONS>
|
|
||||||
<ADDITIONAL_INDENT_OPTIONS fileType="php">
|
|
||||||
<option name="INDENT_SIZE" value="4" />
|
|
||||||
<option name="CONTINUATION_INDENT_SIZE" value="8" />
|
|
||||||
<option name="TAB_SIZE" value="4" />
|
|
||||||
<option name="USE_TAB_CHARACTER" value="false" />
|
|
||||||
<option name="SMART_TABS" value="false" />
|
|
||||||
<option name="LABEL_INDENT_SIZE" value="0" />
|
|
||||||
<option name="LABEL_INDENT_ABSOLUTE" value="false" />
|
|
||||||
<option name="USE_RELATIVE_INDENTS" value="false" />
|
|
||||||
</ADDITIONAL_INDENT_OPTIONS>
|
|
||||||
<ADDITIONAL_INDENT_OPTIONS fileType="sass">
|
|
||||||
<option name="INDENT_SIZE" value="2" />
|
|
||||||
<option name="CONTINUATION_INDENT_SIZE" value="8" />
|
|
||||||
<option name="TAB_SIZE" value="4" />
|
|
||||||
<option name="USE_TAB_CHARACTER" value="false" />
|
|
||||||
<option name="SMART_TABS" value="false" />
|
|
||||||
<option name="LABEL_INDENT_SIZE" value="0" />
|
|
||||||
<option name="LABEL_INDENT_ABSOLUTE" value="false" />
|
|
||||||
<option name="USE_RELATIVE_INDENTS" value="false" />
|
|
||||||
</ADDITIONAL_INDENT_OPTIONS>
|
|
||||||
<ADDITIONAL_INDENT_OPTIONS fileType="sql">
|
|
||||||
<option name="INDENT_SIZE" value="2" />
|
|
||||||
<option name="CONTINUATION_INDENT_SIZE" value="8" />
|
|
||||||
<option name="TAB_SIZE" value="4" />
|
|
||||||
<option name="USE_TAB_CHARACTER" value="false" />
|
|
||||||
<option name="SMART_TABS" value="false" />
|
|
||||||
<option name="LABEL_INDENT_SIZE" value="0" />
|
|
||||||
<option name="LABEL_INDENT_ABSOLUTE" value="false" />
|
|
||||||
<option name="USE_RELATIVE_INDENTS" value="false" />
|
|
||||||
</ADDITIONAL_INDENT_OPTIONS>
|
|
||||||
<ADDITIONAL_INDENT_OPTIONS fileType="xml">
|
|
||||||
<option name="INDENT_SIZE" value="4" />
|
|
||||||
<option name="CONTINUATION_INDENT_SIZE" value="8" />
|
|
||||||
<option name="TAB_SIZE" value="4" />
|
|
||||||
<option name="USE_TAB_CHARACTER" value="false" />
|
|
||||||
<option name="SMART_TABS" value="false" />
|
|
||||||
<option name="LABEL_INDENT_SIZE" value="0" />
|
|
||||||
<option name="LABEL_INDENT_ABSOLUTE" value="false" />
|
|
||||||
<option name="USE_RELATIVE_INDENTS" value="false" />
|
|
||||||
</ADDITIONAL_INDENT_OPTIONS>
|
|
||||||
<ADDITIONAL_INDENT_OPTIONS fileType="yml">
|
|
||||||
<option name="INDENT_SIZE" value="2" />
|
|
||||||
<option name="CONTINUATION_INDENT_SIZE" value="8" />
|
|
||||||
<option name="TAB_SIZE" value="4" />
|
|
||||||
<option name="USE_TAB_CHARACTER" value="false" />
|
|
||||||
<option name="SMART_TABS" value="false" />
|
|
||||||
<option name="LABEL_INDENT_SIZE" value="0" />
|
|
||||||
<option name="LABEL_INDENT_ABSOLUTE" value="false" />
|
|
||||||
<option name="USE_RELATIVE_INDENTS" value="false" />
|
|
||||||
</ADDITIONAL_INDENT_OPTIONS>
|
|
||||||
</value>
|
|
||||||
</option>
|
|
||||||
</component>
|
|
||||||
</project>
|
|
||||||
|
|
@ -1,5 +0,0 @@
|
|||||||
<component name="DependencyValidationManager">
|
|
||||||
<state>
|
|
||||||
<option name="SKIP_IMPORT_STATEMENTS" value="false" />
|
|
||||||
</state>
|
|
||||||
</component>
|
|
@ -1,7 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<project version="4">
|
|
||||||
<component name="VcsDirectoryMappings">
|
|
||||||
<mapping directory="$PROJECT_DIR$/../.." vcs="Git" />
|
|
||||||
</component>
|
|
||||||
</project>
|
|
||||||
|
|
17
src/bower.json
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
{
|
||||||
|
"name": "mibew",
|
||||||
|
"private": true,
|
||||||
|
"dependencies": {
|
||||||
|
"underscore": "1.8.2",
|
||||||
|
"json": "https://github.com/douglascrockford/JSON-js.git#c98948ae1944a28e2e8ebc3717894e580aeaaa05",
|
||||||
|
"jquery": "1.11.3",
|
||||||
|
"backbone": "1.1.2",
|
||||||
|
"marionette": "2.4.1",
|
||||||
|
"handlebars": "4.3.0",
|
||||||
|
"vex": "2.3.2",
|
||||||
|
"validator-js": "3.40.0"
|
||||||
|
},
|
||||||
|
"resolutions": {
|
||||||
|
"underscore": "1.8.2"
|
||||||
|
}
|
||||||
|
}
|
@ -1,56 +0,0 @@
|
|||||||
#!/usr/bin/perl
|
|
||||||
|
|
||||||
sub read_transl($) {
|
|
||||||
my($from) = @_;
|
|
||||||
my %translation = ();
|
|
||||||
open(IN, "mibew/locales/$from/properties");
|
|
||||||
while(<IN>) {
|
|
||||||
chomp;
|
|
||||||
if(/^([\w\.]+)=(.*)$/) {
|
|
||||||
if($1 ne "encoding" && $1 ne "output_charset" && $1 ne "output_encoding") {
|
|
||||||
$translation{$1} = $2;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
die "wrong line in $from: $_\n";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
close(IN);
|
|
||||||
return %translation;
|
|
||||||
}
|
|
||||||
|
|
||||||
%tr_en = read_transl("en");
|
|
||||||
|
|
||||||
@all_keys = keys %tr_en;
|
|
||||||
|
|
||||||
sub check_transl($%) {
|
|
||||||
my($name,%tr) = @_;
|
|
||||||
print "checking $name...\n";
|
|
||||||
my @totransl = ();
|
|
||||||
for $key (@all_keys) {
|
|
||||||
unless(exists $tr{$key}) {
|
|
||||||
push @totransl, "$key=".$tr_en{$key};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for $key(keys %tr) {
|
|
||||||
unless(exists $tr_en{$key}) {
|
|
||||||
print "unknown key in $name: $key\n";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if($#totransl >= 0) {
|
|
||||||
print "@{[$#totransl+1]} lines absent in locales/$name/properties\n";
|
|
||||||
open(OUT, "> absent_$name");
|
|
||||||
for(sort @totransl) {
|
|
||||||
print OUT "$_\n";
|
|
||||||
}
|
|
||||||
close(OUT);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
check_transl("ru", read_transl("ru"));
|
|
||||||
check_transl("fr", read_transl("fr"));
|
|
||||||
check_transl("de", read_transl("de"));
|
|
||||||
check_transl("sp", read_transl("sp"));
|
|
||||||
check_transl("it", read_transl("it"));
|
|
||||||
check_transl("pl", read_transl("pl"));
|
|
||||||
check_transl("zh-tw", read_transl("zh-tw"));
|
|
||||||
|
|
@ -1,5 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
|
|
||||||
cd mibew/js/source
|
|
||||||
ant
|
|
||||||
rm -rf bin
|
|
51
src/composer.json
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
{
|
||||||
|
"name": "mibew/mibew",
|
||||||
|
"version": "3.6.0",
|
||||||
|
"description": "Mibew Messenger - open-source live support application",
|
||||||
|
"type": "project",
|
||||||
|
"homepage": "https://mibew.org",
|
||||||
|
"license": "Apache-2.0",
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Mibew Messenger Project",
|
||||||
|
"homepage": "https://mibew.org/credits"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"support": {
|
||||||
|
"email": "support@mibew.org",
|
||||||
|
"issues": "https://github.com/mibew/mibew/issues",
|
||||||
|
"forum": "https://mibew.org/forums",
|
||||||
|
"source": "https://github.com/mibew/mibew"
|
||||||
|
},
|
||||||
|
"repositories": [
|
||||||
|
{
|
||||||
|
"type": "vcs",
|
||||||
|
"url": "https://github.com/mibew/handlebars.php"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "vcs",
|
||||||
|
"url": "https://github.com/mibew/handlebars.php-helpers"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"require": {
|
||||||
|
"mibew/handlebars.php": "~0.10.5",
|
||||||
|
"mibew/handlebars.php-helpers": "1.*",
|
||||||
|
"symfony/http-foundation": "4.4.*",
|
||||||
|
"symfony/routing": "4.4.*",
|
||||||
|
"symfony/config": "4.4.*",
|
||||||
|
"symfony/yaml": "^5.2",
|
||||||
|
"symfony/translation": "2.6.*",
|
||||||
|
"tedivm/stash": "0.12.*",
|
||||||
|
"mibew/html5": "1.1.*",
|
||||||
|
"vierbergenlars/php-semver": "3.0.*",
|
||||||
|
"swiftmailer/swiftmailer": "~5.4.0",
|
||||||
|
"ua-parser/uap-php": "^3.9",
|
||||||
|
"true/punycode": "~1.1"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"squizlabs/php_codesniffer": "3.*"
|
||||||
|
},
|
||||||
|
"config": {
|
||||||
|
"vendor-dir": "mibew/vendor"
|
||||||
|
}
|
||||||
|
}
|
@ -1,245 +0,0 @@
|
|||||||
#!/usr/bin/perl
|
|
||||||
|
|
||||||
use Digest::MD5 qw(md5 md5_hex md5_base64);
|
|
||||||
|
|
||||||
@rules = (
|
|
||||||
["redirect(ed)?\\.tpl", 1],
|
|
||||||
["\\.tpl", 0],
|
|
||||||
|
|
||||||
["view/license.php", 0],
|
|
||||||
["view/themes.php", 2],
|
|
||||||
["view/translate.php", 2],
|
|
||||||
["view/translatelist.php", 2],
|
|
||||||
["view/settings.php", 2],
|
|
||||||
["view/updates.php", 2],
|
|
||||||
["view/features.php", 2],
|
|
||||||
["view/performance.php", 2],
|
|
||||||
["view/avatar.php", 2],
|
|
||||||
["view/permissions.php", 2],
|
|
||||||
["view/agent.php", 2],
|
|
||||||
["view/agents.php", 2],
|
|
||||||
["view/group.php", 2],
|
|
||||||
["view/groupmembers.php", 2],
|
|
||||||
["view/groups.php", 2],
|
|
||||||
["view/operator_groups.php", 2],
|
|
||||||
["view/gen_button.php", 2],
|
|
||||||
["view/install_err.php", 2],
|
|
||||||
["view/install_index.php", 2],
|
|
||||||
["view/.*\\.php", 1],
|
|
||||||
|
|
||||||
["install/.*\\.php", 2],
|
|
||||||
|
|
||||||
["operator/themes.php", 2],
|
|
||||||
["operator/translate.php", 2],
|
|
||||||
["operator/settings.php", 2],
|
|
||||||
["operator/updates.php", 2],
|
|
||||||
["operator/features.php", 2],
|
|
||||||
["operator/performance.php", 2],
|
|
||||||
["operator/avatar.php", 2],
|
|
||||||
["operator/permissions.php", 2],
|
|
||||||
["operator/operator.php", 2],
|
|
||||||
["operator/operators.php", 2],
|
|
||||||
["operator/group.php", 2],
|
|
||||||
["operator/groupmembers.php", 2],
|
|
||||||
["operator/groups.php", 2],
|
|
||||||
["operator/opgroups.php", 2],
|
|
||||||
["operator/getcode.php", 2],
|
|
||||||
["operator/.*\\.php", 1],
|
|
||||||
|
|
||||||
["mibew/client.php", 0],
|
|
||||||
["mibew/leavemessage.php", 0],
|
|
||||||
["mibew/captcha.php", 0],
|
|
||||||
["mibew/license.php", 0],
|
|
||||||
["mibew/mail.php", 0],
|
|
||||||
|
|
||||||
["libs/operator_settings.php", 2],
|
|
||||||
["mibew/libs/chat.php", 0],
|
|
||||||
["libs/pagination.php", 1],
|
|
||||||
["libs/settings.php", 2],
|
|
||||||
["libs/groups.php", 2],
|
|
||||||
["libs/demothread.php", 2],
|
|
||||||
|
|
||||||
["mibew/thread.php", 0],
|
|
||||||
["mibew/b.php", 0],
|
|
||||||
["mibew/button.php", 0],
|
|
||||||
["mibew/index.php", 0],
|
|
||||||
|
|
||||||
["mibew/libs/.*\\.php", 1],
|
|
||||||
);
|
|
||||||
|
|
||||||
%messagekeys = (
|
|
||||||
"localeid" => 0,
|
|
||||||
"output_charset" => 0,
|
|
||||||
"output_encoding" => 0,
|
|
||||||
"harderrors.header" => 0,
|
|
||||||
|
|
||||||
"errors.required" => 0,
|
|
||||||
"errors.wrong_field" => 0,
|
|
||||||
"errors.file.move.error" => 2,
|
|
||||||
"errors.invalid.file.type" => 2,
|
|
||||||
"errors.file.size.exceeded" => 2,
|
|
||||||
|
|
||||||
"permission.admin" => 1,
|
|
||||||
"permission.takeover" => 1,
|
|
||||||
"permission.viewthreads" => 1,
|
|
||||||
|
|
||||||
"chat.thread.state_chatting_with_agent" => 1,
|
|
||||||
"chat.thread.state_closed" => 1,
|
|
||||||
"chat.thread.state_loading" => 1,
|
|
||||||
"chat.thread.state_wait" => 1,
|
|
||||||
"chat.thread.state_wait_for_another_agent" => 1,
|
|
||||||
|
|
||||||
"clients.queue.chat" => 1,
|
|
||||||
"clients.queue.prio" => 1,
|
|
||||||
"clients.queue.wait" => 1,
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
$mibewPath = "mibew";
|
|
||||||
|
|
||||||
%urls = ();
|
|
||||||
|
|
||||||
%usermessages = ();
|
|
||||||
%operatormessages = ();
|
|
||||||
$current_level = 0;
|
|
||||||
|
|
||||||
sub usemsg($) {
|
|
||||||
my ($m) = @_;
|
|
||||||
$messagekeys{$m} = exists $messagekeys{$m} && $messagekeys{$m} < $current_level ? $messagekeys{$m} : $current_level;
|
|
||||||
if($current_level == -1) {
|
|
||||||
print " .. $m\n";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
sub file_content($) {
|
|
||||||
my $input = $_[0];
|
|
||||||
open( IN1, "< $input" ) or die "cannot find file $input";
|
|
||||||
my $oldslash = $/;
|
|
||||||
$/ = EOI;
|
|
||||||
$content = <IN1>;
|
|
||||||
close( IN1 );
|
|
||||||
if($content =~ s/\r//g) {
|
|
||||||
open( OUT1, "> $input") or die "cannot fix $input";
|
|
||||||
print OUT1 $content;
|
|
||||||
close(OUT1);
|
|
||||||
}
|
|
||||||
$/ = $oldslash;
|
|
||||||
return $content;
|
|
||||||
}
|
|
||||||
|
|
||||||
sub process_tpl($) {
|
|
||||||
my ($filename) = @_;
|
|
||||||
my $m = file_content($filename);
|
|
||||||
while( $m =~ /\${msg:([\w\.]+)(,[\w\.]+)?}/g ) {
|
|
||||||
usemsg($1);
|
|
||||||
}
|
|
||||||
while( $m =~ /\${url:([\w\.]+)(,[\w\.]+)?}/g ) {
|
|
||||||
usemsg($1);
|
|
||||||
$urls{"%$1"} = 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
sub process_php($) {
|
|
||||||
my ($source) = @_;
|
|
||||||
my $content = file_content($source);
|
|
||||||
$content =~ s/<\?xml version=\\"1\.0\\" encoding=\\"UTF-8\\"\?>//;
|
|
||||||
|
|
||||||
while( $content =~ s/<\?(?!xml)(.*?)\?>//s ) {
|
|
||||||
my $inner = $1;
|
|
||||||
while($inner =~ s/(getlocal|getstring|no_field)2?_?\((.*?)[,\)]//s) {
|
|
||||||
my $firstarg = $2;
|
|
||||||
if( $firstarg =~ /^["']([\w\.]+)['"]$/) {
|
|
||||||
usemsg($1);
|
|
||||||
} elsif($firstarg =~ /^\$\w+$/ || $firstarg eq '"$var.header"' || $firstarg eq '"permission.$permid"' || $firstarg eq '$threadstate_key[$thread[\'istate\']]') {
|
|
||||||
# skip
|
|
||||||
} else {
|
|
||||||
print "> unknown: $firstarg\n";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
sub file_checksum($) {
|
|
||||||
my ($source) = @_;
|
|
||||||
if($source =~ /\.(png|gif|jpg|ico|wav)$/ || $source =~ /config\.php$/) {
|
|
||||||
return "-";
|
|
||||||
}
|
|
||||||
|
|
||||||
my $content = file_content($source);
|
|
||||||
return md5_hex($content);
|
|
||||||
}
|
|
||||||
|
|
||||||
@allsources = ();
|
|
||||||
|
|
||||||
sub process_one($) {
|
|
||||||
my($source) = @_;
|
|
||||||
push @allsources, $source unless $source =~ /$mibewPath\/locales/ && $source !~ /$mibewPath\/locales\/(en|names)/ || $source =~ /\/package$/;
|
|
||||||
|
|
||||||
if($source !~ /\.(php|tpl)$/) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
$current_level = -1;
|
|
||||||
|
|
||||||
A: foreach $rule (@rules) {
|
|
||||||
my $key = $$rule[0];
|
|
||||||
if($source =~ /$key/) {
|
|
||||||
$current_level = $$rule[1];
|
|
||||||
last A;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if($current_level < 0 || $current_level > 2) {
|
|
||||||
print "not detected for: $source\n";
|
|
||||||
$current_level = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if($source =~ /\.php$/) {
|
|
||||||
# print "$source ($current_level)\n";
|
|
||||||
process_php($source);
|
|
||||||
} elsif($source =~ /\.tpl$/) {
|
|
||||||
process_tpl($source);
|
|
||||||
} else {
|
|
||||||
#print ". $source\n";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
sub process_files($) {
|
|
||||||
my($from) = @_;
|
|
||||||
opendir(DIR, $from) || die "can't opendir $from: $!";
|
|
||||||
my @content = readdir(DIR);
|
|
||||||
closedir DIR;
|
|
||||||
|
|
||||||
for(grep { -f "$from/$_" && ($_ !~ /^\./ || $_ eq ".htaccess") } @content) {
|
|
||||||
process_one("$from/$_");
|
|
||||||
}
|
|
||||||
for(grep { -d "$from/$_" && $_ !~ /^\./ } @content) {
|
|
||||||
process_files("$from/$_");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
process_files($mibewPath);
|
|
||||||
|
|
||||||
# fix
|
|
||||||
$messagekeys{'page.analysis.userhistory.title'} = 1;
|
|
||||||
$messagekeys{'errors.failed.uploading.file'} = 2;
|
|
||||||
|
|
||||||
|
|
||||||
open( OUT, "> $mibewPath/locales/names/level1") or die "cannot write file, $!";
|
|
||||||
for $key(sort grep { $messagekeys{$_} == 0 } keys %messagekeys) {
|
|
||||||
print OUT "$key\n";
|
|
||||||
}
|
|
||||||
close( OUT );
|
|
||||||
|
|
||||||
open( OUT, "> $mibewPath/locales/names/level2") or die "cannot write file, $!";
|
|
||||||
for $key(sort grep { $messagekeys{$_} == 1 } keys %messagekeys) {
|
|
||||||
print OUT "$key\n";
|
|
||||||
}
|
|
||||||
close( OUT );
|
|
||||||
|
|
||||||
open( OUT, "> $mibewPath/install/package") or die "cannot write file, $!";
|
|
||||||
for $key(sort @allsources) {
|
|
||||||
$digest = file_checksum($key);
|
|
||||||
$key =~ s/$mibewPath\///;
|
|
||||||
print OUT "$key $digest\n";
|
|
||||||
}
|
|
||||||
close( OUT );
|
|
743
src/gulpfile.js
Normal file
@ -0,0 +1,743 @@
|
|||||||
|
// Initialize requirements
|
||||||
|
var fs = require('fs'),
|
||||||
|
https = require('https'),
|
||||||
|
exec = require('child_process').exec,
|
||||||
|
eventStream = require('event-stream'),
|
||||||
|
runSequence = require('gulp4-run-sequence'),
|
||||||
|
through = require('through2'),
|
||||||
|
lodash = require('lodash'),
|
||||||
|
PoFile = require('pofile'),
|
||||||
|
strftime = require('strftime'),
|
||||||
|
del = require('del'),
|
||||||
|
bower = require('bower'),
|
||||||
|
gulp = require('gulp'),
|
||||||
|
uglify = require('gulp-uglify'),
|
||||||
|
concat = require('gulp-concat'),
|
||||||
|
phpcs = require('gulp-phpcs'),
|
||||||
|
order = require('gulp-order'),
|
||||||
|
handlebars = require('gulp-handlebars'),
|
||||||
|
handlebarsEngine = require('handlebars'),
|
||||||
|
defineModule = require('gulp-define-module'),
|
||||||
|
header = require('gulp-header'),
|
||||||
|
zip = require('gulp-zip'),
|
||||||
|
tar = require('gulp-tar'),
|
||||||
|
gzip = require('gulp-gzip'),
|
||||||
|
chmod = require('gulp-chmod'),
|
||||||
|
xgettext = require('gulp-xgettext'),
|
||||||
|
concatPo = require('gulp-concat-po'),
|
||||||
|
rename = require('gulp-rename'),
|
||||||
|
eslint = require('gulp-eslint'),
|
||||||
|
removeDuplicateHeaders = require('mibew-gulp-greh'),
|
||||||
|
mkdirp = require('mkdirp');
|
||||||
|
|
||||||
|
// Set global configuration
|
||||||
|
var config = {
|
||||||
|
mibewPath: 'mibew',
|
||||||
|
configsPath: 'mibew/configs',
|
||||||
|
phpVendorPath: 'mibew/vendor',
|
||||||
|
jsVendorPath: 'mibew/js/vendor',
|
||||||
|
pluginsPath: 'mibew/plugins',
|
||||||
|
avatarsPath: 'mibew/files/avatar',
|
||||||
|
cachePath: 'mibew/cache',
|
||||||
|
jsPath: 'mibew/js',
|
||||||
|
chatStylesPath: 'mibew/styles/chats',
|
||||||
|
pageStylesPath: 'mibew/styles/pages',
|
||||||
|
i18nPath: 'i18n',
|
||||||
|
i18nPrefix: 'mibew-i18n-',
|
||||||
|
releasePath: 'release',
|
||||||
|
uploadPath: 'upload',
|
||||||
|
compiledTemplatesHeader: fs.readFileSync('tools/compiled_templates_header.txt'),
|
||||||
|
getComposerUrl: 'https://getcomposer.org/installer',
|
||||||
|
phpBin: 'php -d "suhosin.executor.include.whitelist = phar" -d "memory_limit=512M"',
|
||||||
|
package: require('./composer.json'),
|
||||||
|
msginit: 'msginit',
|
||||||
|
msgcat: 'msgcat'
|
||||||
|
}
|
||||||
|
config.i18nSuffix = '-' + config.package.version + '-' + strftime('%Y%m%d');
|
||||||
|
|
||||||
|
// Tasks for cleaning //////////////////
|
||||||
|
|
||||||
|
// Cleans all built files
|
||||||
|
gulp.task('clean', function(callback) {
|
||||||
|
return del([
|
||||||
|
config.releasePath,
|
||||||
|
'composer.lock',
|
||||||
|
config.phpVendorPath,
|
||||||
|
config.jsVendorPath,
|
||||||
|
config.jsPath + '/compiled/**/*',
|
||||||
|
'!' + config.jsPath + '/compiled/.keep',
|
||||||
|
config.chatStylesPath + '/*/templates_compiled/client_side/*.js',
|
||||||
|
config.chatStylesPath + '/*/js/compiled/*.js',
|
||||||
|
config.pageStylesPath + '/*/templates_compiled/client_side/*.js'
|
||||||
|
], callback);
|
||||||
|
});
|
||||||
|
|
||||||
|
// Cleans temporary English translation in the release dir
|
||||||
|
gulp.task('clean-tmp-po', function(callback) {
|
||||||
|
return del([config.releasePath + '/translation.po'], callback);
|
||||||
|
});
|
||||||
|
|
||||||
|
// Cleans temporary files of translations in the release dir
|
||||||
|
gulp.task('clean-tmp-i18n-files', function(callback) {
|
||||||
|
return del([
|
||||||
|
config.releasePath + '/**/*',
|
||||||
|
'!' + config.releasePath + '/*.zip',
|
||||||
|
'!' + config.releasePath + '/*.tar.gz',
|
||||||
|
'!' + config.releasePath + '/*.pot'
|
||||||
|
], callback);
|
||||||
|
});
|
||||||
|
|
||||||
|
// Cleans all files prepared for uploading to CDN
|
||||||
|
gulp.task('clean-upload', function(callback) {
|
||||||
|
return del([config.uploadPath], callback);
|
||||||
|
});
|
||||||
|
|
||||||
|
// Cleans everything
|
||||||
|
gulp.task('clean-all', function(callback) {
|
||||||
|
runSequence( ['clean', 'clean-upload'],
|
||||||
|
callback );
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
// Watcher tasks ///////////////////////
|
||||||
|
|
||||||
|
// Watch styles
|
||||||
|
gulp.task('watch', function() {
|
||||||
|
gulp.watch(config.pageStylesPath + '/**/*.handlebars', gulp.series('page-styles'));
|
||||||
|
gulp.watch(config.chatStylesPath + '/**/js/source/**/*.js', gulp.series('chat-styles-js'));
|
||||||
|
gulp.watch(config.chatStylesPath + '/**/*.handlebars', gulp.series('chat-styles-handlebars'));
|
||||||
|
});
|
||||||
|
|
||||||
|
// Service tasks //////////////////
|
||||||
|
|
||||||
|
// Get and install PHP Composer
|
||||||
|
gulp.task('get-composer', function(callback) {
|
||||||
|
// Check whether Composer is already in place
|
||||||
|
if (fs.existsSync('./composer.phar')) {
|
||||||
|
callback(null);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get installer from the Internet
|
||||||
|
https.get(config.getComposerUrl, function(response) {
|
||||||
|
// Run PHP to install Composer
|
||||||
|
var php = exec(config.phpBin, function(error, stdout, stderr) {
|
||||||
|
callback(error ? stderr : null);
|
||||||
|
});
|
||||||
|
// Pass installer code to PHP via STDIN
|
||||||
|
response.pipe(php.stdin);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
// Install Composer dependencies excluding development ones
|
||||||
|
gulp.task('composer-install', gulp.series('get-composer', function(callback) {
|
||||||
|
exec(config.phpBin + ' composer.phar install --no-dev',
|
||||||
|
function(error, stdout, stderr) {
|
||||||
|
callback(error ? stderr : null);
|
||||||
|
});
|
||||||
|
}));
|
||||||
|
|
||||||
|
// Install all Composer dependencies
|
||||||
|
gulp.task('composer-install-dev', gulp.series('get-composer', function(callback) {
|
||||||
|
exec(config.phpBin + ' composer.phar install',
|
||||||
|
function(error, stdout, stderr) {
|
||||||
|
callback(error ? stderr : null);
|
||||||
|
});
|
||||||
|
}));
|
||||||
|
|
||||||
|
// Installs bower dependencies
|
||||||
|
gulp.task('bower-install', function(callback) {
|
||||||
|
bower.commands.install([], {}, {})
|
||||||
|
.on('error', function(error) {
|
||||||
|
callback(error);
|
||||||
|
})
|
||||||
|
.on('end', function() {
|
||||||
|
// We should manually minify JavaScript files that was not minified
|
||||||
|
// by bower packages' authors
|
||||||
|
// TODO: This is a temproary workaround and should be removed once
|
||||||
|
// the packages will be fixed
|
||||||
|
var stream = eventStream.merge(
|
||||||
|
gulp.src(config.jsVendorPath + '/backbone/backbone.js',
|
||||||
|
{base: config.jsVendorPath})
|
||||||
|
.pipe(uglify({preserveComments: 'some'}))
|
||||||
|
// There are neither "@license" tag nor "!preserve" in the
|
||||||
|
// header. Add the header manually
|
||||||
|
.pipe(header(
|
||||||
|
"// Backbone.js 1.1.2\n"
|
||||||
|
+ "// (c) 2010-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n"
|
||||||
|
+ "// Backbone may be freely distributed under the MIT license.\n"
|
||||||
|
+ "// For all details and documentation:\n"
|
||||||
|
+ "// http://backbonejs.org\n"
|
||||||
|
))
|
||||||
|
.pipe(rename('backbone/backbone-min.js')),
|
||||||
|
gulp.src(config.jsVendorPath + '/json/json2.js',
|
||||||
|
{base: config.jsVendorPath})
|
||||||
|
.pipe(uglify({preserveComments: 'some'}))
|
||||||
|
// There are neither "@license" tag nor "!preserve" in the
|
||||||
|
// header, add the header manually
|
||||||
|
.pipe(header("// json2.js. Public Domain. See http://www.JSON.org/js.html\n"))
|
||||||
|
.pipe(rename('json/json2.min.js'))
|
||||||
|
)
|
||||||
|
.pipe(gulp.dest(config.jsVendorPath));
|
||||||
|
|
||||||
|
stream
|
||||||
|
.on('error', callback)
|
||||||
|
.on('end', callback);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
// Tasks for checking //////////////////
|
||||||
|
|
||||||
|
// Checks all PHP files with PHP Code Sniffer
|
||||||
|
gulp.task('phpcs', gulp.series('composer-install-dev', function() {
|
||||||
|
return gulp.src([
|
||||||
|
config.mibewPath + '/**/*.php',
|
||||||
|
'!' + config.phpVendorPath + '/**/*.*',
|
||||||
|
'!' + config.pluginsPath + '/**/*.*',
|
||||||
|
'!' + config.cachePath + '/**/*.*'
|
||||||
|
], {
|
||||||
|
// Content of the cache directory is readable only for webserver.
|
||||||
|
// Thus we must to set "strict" option to false to prevent "EACCES"
|
||||||
|
// errors. At the same we need to see all errors that take place.
|
||||||
|
strict: false,
|
||||||
|
silent: false
|
||||||
|
})
|
||||||
|
.pipe(phpcs({
|
||||||
|
bin: config.phpVendorPath + '/bin/phpcs',
|
||||||
|
standard: 'PSR2',
|
||||||
|
warningSeverity: 0
|
||||||
|
}))
|
||||||
|
.pipe(phpcs.reporter('log'))
|
||||||
|
.pipe(phpcs.reporter('fail'));
|
||||||
|
}));
|
||||||
|
|
||||||
|
// Checks all JavaScript Source files with ESLint
|
||||||
|
gulp.task('eslint', function() {
|
||||||
|
return gulp.src(config.jsPath + '/source/**/*.js')
|
||||||
|
.pipe(eslint())
|
||||||
|
.pipe(eslint.format())
|
||||||
|
.pipe(eslint.failAfterError());
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
// Restore empty English translation in the source code
|
||||||
|
gulp.task('post-pack-cleanup', function(callback) {
|
||||||
|
gulp.src('translation.po')
|
||||||
|
.pipe(gulp.dest(config.mibewPath + '/locales/en/'));
|
||||||
|
|
||||||
|
del(['translation.po', config.releasePath + '/translation.po'], callback);
|
||||||
|
});
|
||||||
|
|
||||||
|
// Tasks of compiling //////////////////
|
||||||
|
|
||||||
|
// Compile all JavaScript files of the Mibew Messenger Core
|
||||||
|
gulp.task('js', function() {
|
||||||
|
return eventStream.merge(
|
||||||
|
getClientSideApp('default'),
|
||||||
|
getClientSideApp('chat'),
|
||||||
|
getClientSideApp('thread_log'),
|
||||||
|
getClientSideApp('users'),
|
||||||
|
gulp.src(config.jsPath + '/source/**/*.js')
|
||||||
|
)
|
||||||
|
.pipe(uglify({preserveComments: 'some'}))
|
||||||
|
.pipe(removeDuplicateHeaders())
|
||||||
|
.pipe(gulp.dest(config.jsPath + '/compiled'));
|
||||||
|
});
|
||||||
|
|
||||||
|
// Compile and concatenate Handlebars templates for all chat styles
|
||||||
|
gulp.task('chat-styles-handlebars', function() {
|
||||||
|
return getChildDirs(config.chatStylesPath)
|
||||||
|
.then(function (dirs) {
|
||||||
|
return Promise.all(dirs.map(function (dir) {
|
||||||
|
return new Promise(function(resolve, reject) {
|
||||||
|
gulp.src(config.chatStylesPath + '/' + dir
|
||||||
|
+ '/templates_src/client_side/**/*.handlebars')
|
||||||
|
.pipe(handlebars({
|
||||||
|
// Use specific version of Handlebars.js
|
||||||
|
handlebars: handlebarsEngine
|
||||||
|
}))
|
||||||
|
.pipe(wrapHandlebarsTemplate())
|
||||||
|
.pipe(concat('templates.js'))
|
||||||
|
.pipe(uglify({preserveComments: 'some'}))
|
||||||
|
.pipe(header(config.compiledTemplatesHeader))
|
||||||
|
.pipe(gulp.dest(config.chatStylesPath + '/' + dir
|
||||||
|
+ '/templates_compiled/client_side'))
|
||||||
|
.on('end', resolve)
|
||||||
|
.on('error', reject);
|
||||||
|
});
|
||||||
|
}));
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
// Compile and concatenate js files for all chat styles
|
||||||
|
gulp.task('chat-styles-js', function() {
|
||||||
|
return getChildDirs(config.chatStylesPath)
|
||||||
|
.then(function (dirs) {
|
||||||
|
return Promise.all(dirs.map(function (dir) {
|
||||||
|
return new Promise(function(resolve, reject) {
|
||||||
|
gulp.src(config.chatStylesPath + '/' + dir
|
||||||
|
+ '/js/source/**/*.js')
|
||||||
|
.pipe(concat('scripts.js'))
|
||||||
|
.pipe(uglify({preserveComments: 'some'}))
|
||||||
|
.pipe(gulp.dest(config.chatStylesPath + '/' + dir
|
||||||
|
+ '/js/compiled'))
|
||||||
|
.on('end', resolve)
|
||||||
|
.on('error', reject);
|
||||||
|
});
|
||||||
|
}));
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
// Performs all job related to pages styles
|
||||||
|
gulp.task('page-styles', function() {
|
||||||
|
return getChildDirs(config.pageStylesPath)
|
||||||
|
.then(function (dirs) {
|
||||||
|
return Promise.all(dirs.map(function (dir) {
|
||||||
|
return new Promise(function(resolve, reject){
|
||||||
|
gulp.src(config.pageStylesPath + '/' + dir
|
||||||
|
+ '/templates_src/client_side/**/*.handlebars')
|
||||||
|
.pipe(handlebars({
|
||||||
|
// Use specific version of Handlebars.js
|
||||||
|
handlebars: handlebarsEngine
|
||||||
|
}))
|
||||||
|
.pipe(wrapHandlebarsTemplate())
|
||||||
|
.pipe(concat('templates.js'))
|
||||||
|
.pipe(uglify({preserveComments: 'some'}))
|
||||||
|
.pipe(header(config.compiledTemplatesHeader))
|
||||||
|
.pipe(gulp.dest(config.pageStylesPath + '/' + dir
|
||||||
|
+ '/templates_compiled/client_side'))
|
||||||
|
.on('end', resolve)
|
||||||
|
.on('error', reject);
|
||||||
|
});
|
||||||
|
}));
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
// Performs all job related to chat styles
|
||||||
|
gulp.task('chat-styles', gulp.series('chat-styles-handlebars', 'chat-styles-js'));
|
||||||
|
|
||||||
|
// Prepares ready to use development version of Mibew Messenger without
|
||||||
|
// packing or validating it
|
||||||
|
gulp.task('rebuild', function(callback) {
|
||||||
|
runSequence(
|
||||||
|
'clean',
|
||||||
|
['js', 'chat-styles', 'page-styles', 'composer-install',
|
||||||
|
'bower-install'],
|
||||||
|
callback
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
// Tasks for localization issues ///////
|
||||||
|
|
||||||
|
// Generate POT-file based upon the source code
|
||||||
|
gulp.task('generate-pot', function() {
|
||||||
|
return eventStream.merge(
|
||||||
|
gulp.src([
|
||||||
|
config.mibewPath + '/**/*.php',
|
||||||
|
'!' + config.phpVendorPath + '/**/*.*',
|
||||||
|
'!' + config.pluginsPath + '/**/*.*',
|
||||||
|
'!' + config.cachePath + '/**/*.*'
|
||||||
|
], {
|
||||||
|
// Content of the cache directory is readable only for
|
||||||
|
// webserver. Thus we must to set "strict" option to false
|
||||||
|
// to prevent "EACCES" errors. At the same we need to see all
|
||||||
|
// errors that take place.
|
||||||
|
strict: false,
|
||||||
|
silent: false
|
||||||
|
})
|
||||||
|
.pipe(xgettext({
|
||||||
|
language: 'PHP',
|
||||||
|
keywords: [
|
||||||
|
{name: 'getlocal'},
|
||||||
|
{name: 'no_field'},
|
||||||
|
{name: 'wrong_field'},
|
||||||
|
{name: 'failed_uploading_file', singular: 2}
|
||||||
|
]
|
||||||
|
})),
|
||||||
|
gulp.src(config.jsPath + '/source/**/*.js', {base: config.mibewPath})
|
||||||
|
.pipe(xgettext({
|
||||||
|
language: 'JavaScript',
|
||||||
|
keywords: [
|
||||||
|
{name: 'trans'}
|
||||||
|
]
|
||||||
|
})),
|
||||||
|
gulp.src([
|
||||||
|
config.chatStylesPath + '/default/templates_src/**/*.handlebars',
|
||||||
|
config.pageStylesPath + '/default/templates_src/**/*.handlebars'
|
||||||
|
], {base: config.mibewPath})
|
||||||
|
.pipe(xgettextHandlebars())
|
||||||
|
)
|
||||||
|
.pipe(concatPo(config.i18nPrefix + 'translation'
|
||||||
|
+ config.i18nSuffix + '.pot',
|
||||||
|
{
|
||||||
|
headers: {
|
||||||
|
'Project-Id-Version': 'Mibew Messenger '
|
||||||
|
+ config.package.version,
|
||||||
|
'Report-Msgid-Bugs-To': config.package.support.email,
|
||||||
|
'POT-Creation-Date': strftime('%Y-%m-%d %H:%M%z'),
|
||||||
|
'PO-Revision-Date': '',
|
||||||
|
'Last-Translator': '',
|
||||||
|
'Language-Team': '',
|
||||||
|
'Content-Type': 'text/plain; charset=UTF-8'
|
||||||
|
}
|
||||||
|
})
|
||||||
|
)
|
||||||
|
.pipe(gulp.dest(config.releasePath));
|
||||||
|
});
|
||||||
|
|
||||||
|
// Generate temporary English translation to be used in the release
|
||||||
|
gulp.task('generate-tmp-po', gulp.series('generate-pot', function(callback) {
|
||||||
|
return exec(config.msginit + ' --no-translator --no-wrap -i '
|
||||||
|
+ config.releasePath + '/' + config.i18nPrefix + 'translation'
|
||||||
|
+ config.i18nSuffix + '.pot' + ' -l en -o '
|
||||||
|
+ config.releasePath + '/translation.po',
|
||||||
|
function(error, stdout, stderr) {
|
||||||
|
callback(error ? stderr : null);
|
||||||
|
});
|
||||||
|
}));
|
||||||
|
|
||||||
|
// Generate complete translations (that includes missed strings) to be used
|
||||||
|
// in the release
|
||||||
|
gulp.task('generate-pos', gulp.series('generate-tmp-po', function(callback) {
|
||||||
|
|
||||||
|
return getChildDirs(config.i18nPath + '/translations')
|
||||||
|
.then(function (dirs) {
|
||||||
|
return Promise.all(dirs.map(function (dir) {
|
||||||
|
return new Promise(function(resolve, reject) {
|
||||||
|
mkdirp(config.releasePath + '/' + dir, function (error) {
|
||||||
|
if (error) {
|
||||||
|
reject(error);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
exec(config.msgcat + ' ' + config.i18nPath + '/translations/'
|
||||||
|
+ dir + '/translation.po ' + config.releasePath
|
||||||
|
+ '/translation.po --no-location --no-wrap --use-first'
|
||||||
|
+ ' -o ' + config.releasePath + '/' + dir
|
||||||
|
+ '/translation.po',
|
||||||
|
function(error, stdout, stderr) {
|
||||||
|
if (error) {
|
||||||
|
reject(error);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
var sources = [
|
||||||
|
config.i18nPath + '/translations/' + dir + '/**/*',
|
||||||
|
'!' + config.i18nPath + '/translations/' + dir
|
||||||
|
+ '/translation.po'
|
||||||
|
];
|
||||||
|
|
||||||
|
gulp.src(sources)
|
||||||
|
.pipe(gulp.dest(config.releasePath + '/' + dir))
|
||||||
|
.on('error', reject)
|
||||||
|
.on('end', resolve);
|
||||||
|
});
|
||||||
|
}));
|
||||||
|
});
|
||||||
|
}));
|
||||||
|
|
||||||
|
// Packaging tasks /////////////////////
|
||||||
|
|
||||||
|
// Pack sources for release as .zip and .tar.gz archives
|
||||||
|
gulp.task('pack-sources', gulp.series('composer-install', 'bower-install', function() {
|
||||||
|
gulp.src(config.mibewPath + '/locales/en/translation.po')
|
||||||
|
.pipe(gulp.dest('.'));
|
||||||
|
gulp.src(config.releasePath + '/translation.po')
|
||||||
|
.pipe(gulp.dest(config.mibewPath + '/locales/en/'));
|
||||||
|
|
||||||
|
var sources = [
|
||||||
|
config.mibewPath + '/**/*',
|
||||||
|
// Exclude user's config
|
||||||
|
'!' + config.configsPath + '/config.yml',
|
||||||
|
// Exclude cache files but not the ".keep" file.
|
||||||
|
'!' + config.cachePath + '/**/!(.keep)',
|
||||||
|
// Exclude avatars but not the ".keep" file.
|
||||||
|
'!' + config.avatarsPath + '/!(.keep)',
|
||||||
|
// Exclude plugins but not the ".keep" file.
|
||||||
|
'!' + config.pluginsPath + '/!(.keep)',
|
||||||
|
'!' + config.pluginsPath + '/*/**/*',
|
||||||
|
// Exclude Git repositories that can be shipped with third-party libs
|
||||||
|
'!' + config.phpVendorPath + '/**/.git',
|
||||||
|
'!' + config.phpVendorPath + '/**/.git/**/*',
|
||||||
|
// Exclude vendors binaries
|
||||||
|
'!' + config.phpVendorPath + '/bin/**/*',
|
||||||
|
// Exclude JavaScript sources
|
||||||
|
'!' + config.jsPath + '/source/**/*',
|
||||||
|
// Actually we does not need backbone.babysitter and backbone.wreqr
|
||||||
|
// dependencies because they embed into marionette.js. So we exclude
|
||||||
|
// "backbone.babysitter" and "backbone.wreqr" directories and all their
|
||||||
|
// contents.
|
||||||
|
'!' + config.jsVendorPath + '/backbone.babysitter{,/**}',
|
||||||
|
'!' + config.jsVendorPath + '/backbone.wreqr{,/**}',
|
||||||
|
// Exclude dot files within third-party JS libraries.
|
||||||
|
'!' + config.jsVendorPath + '/**/.*',
|
||||||
|
// Exclude config files of various package systems
|
||||||
|
'!' + config.jsVendorPath + '/**/{bower,component,package,composer}.json',
|
||||||
|
// Exclude config files of various build systems
|
||||||
|
'!' + config.jsVendorPath + '/**/Gruntfile.*',
|
||||||
|
'!' + config.jsVendorPath + '/**/gulpfile.*',
|
||||||
|
'!' + config.jsVendorPath + '/**/Makefile',
|
||||||
|
// Exclude HTML files from third-party JS libraries. Such files can be
|
||||||
|
// used for docs or for tests, we need none of them.
|
||||||
|
'!' + config.jsVendorPath + '/**/*.html',
|
||||||
|
// There are too many useless files in Vex.js library. Exclude them.
|
||||||
|
'!' + config.jsVendorPath + '/vex/sass{,/**}',
|
||||||
|
'!' + config.jsVendorPath + '/vex/docs{,/**}',
|
||||||
|
'!' + config.jsVendorPath + '/vex/docs{,/**}',
|
||||||
|
'!' + config.jsVendorPath + '/vex/coffee{,/**}'
|
||||||
|
];
|
||||||
|
var srcOptions = {
|
||||||
|
// Dot files (.htaccess, .keep, etc.) must be included in the package
|
||||||
|
dot: true,
|
||||||
|
// Content of the cache directory is readable only for webserver. Thus
|
||||||
|
// we must to set "strict" option to false to prevent "EACCES" errors.
|
||||||
|
// At the same we need to see all errors that take place.
|
||||||
|
strict: false,
|
||||||
|
silent: false,
|
||||||
|
// Preserve root directory name (i.e. 'mibew/')
|
||||||
|
base: '.'
|
||||||
|
}
|
||||||
|
var version = config.package.version;
|
||||||
|
|
||||||
|
return eventStream.merge(
|
||||||
|
gulp.src(sources, srcOptions)
|
||||||
|
.pipe(zip('mibew-' + version + '.zip')),
|
||||||
|
gulp.src(sources, srcOptions)
|
||||||
|
.pipe(tar('mibew-' + version + '.tar'))
|
||||||
|
.pipe(gzip())
|
||||||
|
)
|
||||||
|
.pipe(chmod(644))
|
||||||
|
.pipe(gulp.dest(config.releasePath));
|
||||||
|
}));
|
||||||
|
|
||||||
|
// Pack translations for release as .zip and .tar.gz archives
|
||||||
|
gulp.task('pack-i18n', function(callback) {
|
||||||
|
return getChildDirs(config.i18nPath + '/translations')
|
||||||
|
.then(function (dirs) {
|
||||||
|
return Promise.all(dirs.map(function (dir) {
|
||||||
|
return new Promise(function(resolve, reject) {
|
||||||
|
|
||||||
|
var srcOptions = {
|
||||||
|
base: config.releasePath
|
||||||
|
};
|
||||||
|
|
||||||
|
eventStream.merge(
|
||||||
|
gulp.src(config.releasePath + '/' + dir
|
||||||
|
+ '/**/*', srcOptions)
|
||||||
|
.pipe(zip(config.i18nPrefix + dir
|
||||||
|
+ config.i18nSuffix + '.zip')),
|
||||||
|
gulp.src(config.releasePath + '/' + dir
|
||||||
|
+ '/**/*', srcOptions)
|
||||||
|
.pipe(tar(config.i18nPrefix + dir
|
||||||
|
+ config.i18nSuffix + '.tar'))
|
||||||
|
.pipe(gzip())
|
||||||
|
)
|
||||||
|
.pipe(chmod(644))
|
||||||
|
.pipe(gulp.dest(config.releasePath))
|
||||||
|
.on('error', reject)
|
||||||
|
.on('end', resolve);
|
||||||
|
|
||||||
|
});
|
||||||
|
}));
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
// Tasks of releasing //////////////////
|
||||||
|
|
||||||
|
// Prepare release of Mibew Messenger
|
||||||
|
gulp.task('prepare-release', function(callback) {
|
||||||
|
runSequence(
|
||||||
|
'clean',
|
||||||
|
['phpcs', 'js', 'chat-styles', 'page-styles', 'generate-pot',
|
||||||
|
'generate-tmp-po'],
|
||||||
|
'pack-sources',
|
||||||
|
'post-pack-cleanup',
|
||||||
|
callback
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
// Prepare releases of translations for Mibew Messenger
|
||||||
|
gulp.task('prepare-i18n-release', function(callback) {
|
||||||
|
runSequence( 'clean-tmp-po',
|
||||||
|
'generate-pos',
|
||||||
|
'pack-i18n',
|
||||||
|
'clean-tmp-i18n-files',
|
||||||
|
callback
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
// Mirror prepared releases of Mibew Messenger and its translations in a form
|
||||||
|
// intended for uploading into the CDN
|
||||||
|
gulp.task('prepare-for-upload', function(callback) {
|
||||||
|
gulp.src(config.releasePath + '/mibew-' + config.package.version + '.*')
|
||||||
|
.pipe(gulp.dest(config.uploadPath + '/core/' + config.package.version + '/'));
|
||||||
|
|
||||||
|
gulp.src(config.releasePath + '/mibew-i18n-translation-' + config.package.version + '-*.pot')
|
||||||
|
.pipe(gulp.dest(config.uploadPath + '/i18n/_pot/' + config.package.version + '/'));
|
||||||
|
|
||||||
|
return getChildDirs(config.i18nPath + '/translations')
|
||||||
|
.then(function (dirs) {
|
||||||
|
return Promise.all(dirs.map(function (dir) {
|
||||||
|
return new Promise(function(resolve, reject) {
|
||||||
|
gulp.src(config.releasePath + '/mibew-i18n-' + dir + '-' + config.package.version + '-*.*')
|
||||||
|
.pipe(gulp.dest(config.uploadPath + '/i18n/' + dir + '/' + config.package.version + '/'))
|
||||||
|
.on('error', reject)
|
||||||
|
.on('end', resolve);
|
||||||
|
});
|
||||||
|
}));
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
// Perform all preparations before uploading the release of Mibew Messenger and
|
||||||
|
// its translations into the CDN
|
||||||
|
gulp.task('prepare-all', function(callback) {
|
||||||
|
runSequence('clean-all', 'prepare-release', 'prepare-i18n-release',
|
||||||
|
'prepare-for-upload', callback);
|
||||||
|
});
|
||||||
|
|
||||||
|
// Prepare release archives of the development version of Mibew Messenger
|
||||||
|
gulp.task('default', function(callback) {
|
||||||
|
runSequence(
|
||||||
|
'clean',
|
||||||
|
['js', 'chat-styles', 'page-styles', 'generate-tmp-po'],
|
||||||
|
'pack-sources',
|
||||||
|
['post-pack-cleanup', 'clean-tmp-po'],
|
||||||
|
callback
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Loads and prepare js file for a client side application with the specified
|
||||||
|
* name.
|
||||||
|
*
|
||||||
|
* @param {String} name Application name.
|
||||||
|
* @returns A files stream that can be piped to any gulp plugin.
|
||||||
|
*/
|
||||||
|
var getClientSideApp = function(name) {
|
||||||
|
var appSource = config.jsPath + '/source/' + name;
|
||||||
|
|
||||||
|
return gulp.src(appSource + '/**/*.js')
|
||||||
|
.pipe(order(
|
||||||
|
[
|
||||||
|
appSource + '/init.js',
|
||||||
|
// The following line is equivalent to
|
||||||
|
// gulp.src([appSource + '/*.js', '!' + appSource + '/app.js']);
|
||||||
|
appSource + '/!(app).js',
|
||||||
|
appSource + '/models/**/base*.js',
|
||||||
|
appSource + '/models/**/*.js',
|
||||||
|
appSource + '/collections/**/base*.js',
|
||||||
|
appSource + '/collections/**/*.js',
|
||||||
|
appSource + '/model_views/**/base*.js',
|
||||||
|
appSource + '/model_views/**/*.js',
|
||||||
|
appSource + '/collection_views/**/base*.js',
|
||||||
|
appSource + '/collection_views/**/*.js',
|
||||||
|
appSource + '/regions/**/base*.js',
|
||||||
|
appSource + '/regions/**/*.js',
|
||||||
|
appSource + '/layouts/**/base*.js',
|
||||||
|
appSource + '/layouts/**/*.js',
|
||||||
|
appSource + '/**/base*.js',
|
||||||
|
// The following line is equivalent to
|
||||||
|
// gulp.src([appSource + '/**/*.js', '!' + appSource + '/app.js']);
|
||||||
|
'!' + appSource + '/app.js',
|
||||||
|
appSource + '/app.js'
|
||||||
|
],
|
||||||
|
{base: process.cwd()}
|
||||||
|
))
|
||||||
|
.pipe(concat(name + '_app.js'));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Wraps a handlebars template with a function and attach it to the
|
||||||
|
* Handlebars.templates object.
|
||||||
|
*
|
||||||
|
* @returns {Function} A function that can be used in pipe() method of a file
|
||||||
|
* stream right after gulp-handlebars plugin.
|
||||||
|
*/
|
||||||
|
var wrapHandlebarsTemplate = function() {
|
||||||
|
return defineModule('plain', {
|
||||||
|
wrapper: '(function() {\n'
|
||||||
|
+ 'var templates = Handlebars.templates = Handlebars.templates || {};\n'
|
||||||
|
+ 'Handlebars.templates["<%= relative %>"] = <%= handlebars %>;\n'
|
||||||
|
+ '})()',
|
||||||
|
context: function(context) {
|
||||||
|
return {relative: context.file.relative.replace(/\.js$/, '').replace(/\\/g, '/')};
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Extracts gettext messages from handlebars templates.
|
||||||
|
*
|
||||||
|
* @returns {Function} A function that can be used in pipe() method of a file
|
||||||
|
* stream.
|
||||||
|
*/
|
||||||
|
var xgettextHandlebars = function() {
|
||||||
|
var helperRegExp = /\{{2}l10n\s*('|")(.*?[^\\])\1.*?\}{2}/g;
|
||||||
|
|
||||||
|
return through.obj(function (file, enc, callback) {
|
||||||
|
var po = new PoFile();
|
||||||
|
match = false,
|
||||||
|
contents = file.contents.toString();
|
||||||
|
|
||||||
|
while (match = helperRegExp.exec(contents)) {
|
||||||
|
// Try to find item in the .po file by its name
|
||||||
|
var item = lodash.find(po.items, function(item) {
|
||||||
|
return match[2] === item.msgid;
|
||||||
|
});
|
||||||
|
|
||||||
|
var line = contents.substr(0, match.index).split(/\r?\n|\r/g).length;
|
||||||
|
|
||||||
|
if (!item) {
|
||||||
|
// There is no such item, create new one
|
||||||
|
item = new PoFile.Item();
|
||||||
|
item.msgid = match[2].replace(/\\'/g, "'").replace(/\\"/g, '"');
|
||||||
|
po.items.push(item);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add new reference
|
||||||
|
item.references.push(file.relative + ':' + line);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update file contents
|
||||||
|
file.contents = Buffer.from(po.toString());
|
||||||
|
this.push(file);
|
||||||
|
|
||||||
|
callback();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retrieves list of all dirs which are placed in the specified one.
|
||||||
|
*
|
||||||
|
* @param {String} srcDir A dir to search.
|
||||||
|
* @returns Promise A promise which will be resolved with list of child dirs or
|
||||||
|
* rejected with the occured error.
|
||||||
|
*/
|
||||||
|
var getChildDirs = function(srcDir) {
|
||||||
|
return (new Promise(function(resolve, reject) {
|
||||||
|
fs.readdir(srcDir, function (err, files) {
|
||||||
|
if (err) {
|
||||||
|
reject(err);
|
||||||
|
} else {
|
||||||
|
resolve(files);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
})).then(function (files) {
|
||||||
|
// Replace all files that are not a directory with nulls.
|
||||||
|
return Promise.all(files.map(function (file) {
|
||||||
|
return new Promise(function (resolve, reject) {
|
||||||
|
fs.lstat(srcDir + '/' + file, function (err, stat) {
|
||||||
|
if (err) {
|
||||||
|
reject(err);
|
||||||
|
} else {
|
||||||
|
resolve(stat.isDirectory() ? file : null);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}));
|
||||||
|
}).then(function(dirs) {
|
||||||
|
// Remove all nulls from the array.
|
||||||
|
return dirs.filter(function (dir) {
|
||||||
|
return null !== dir;
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
1
src/i18n
Submodule
@ -0,0 +1 @@
|
|||||||
|
Subproject commit 55868d9973f531c3550575481bde4233cc625b91
|
@ -1,12 +1,14 @@
|
|||||||
# Set default handler for incoming requests
|
|
||||||
DirectoryIndex index.php
|
|
||||||
|
|
||||||
# Disable directory listing
|
# Disable directory listing
|
||||||
Options -Indexes
|
Options -Indexes
|
||||||
|
|
||||||
# Follow symbolic links in the directory
|
# Follow symbolic links in the directory
|
||||||
Options +FollowSymLinks
|
Options +FollowSymLinks
|
||||||
|
|
||||||
|
<IfModule mod_negotiation.c>
|
||||||
|
# Forbid apache to guess file extensions
|
||||||
|
Options -MultiViews
|
||||||
|
</IfModule>
|
||||||
|
|
||||||
# Disable mod_security for Apache 1.x
|
# Disable mod_security for Apache 1.x
|
||||||
<IfModule mod_security.c>
|
<IfModule mod_security.c>
|
||||||
SecFilterEngine Off
|
SecFilterEngine Off
|
||||||
@ -23,3 +25,40 @@ Options +FollowSymLinks
|
|||||||
php_value mbstring.http_output pass
|
php_value mbstring.http_output pass
|
||||||
php_flag session.auto_start off
|
php_flag session.auto_start off
|
||||||
</IfModule>
|
</IfModule>
|
||||||
|
|
||||||
|
# Redirect requests to the front controller
|
||||||
|
<IfModule mod_rewrite.c>
|
||||||
|
# Use the front controller as a default handler
|
||||||
|
DirectoryIndex index.php
|
||||||
|
|
||||||
|
RewriteEngine On
|
||||||
|
|
||||||
|
# Use separate front controller for the system installator
|
||||||
|
RewriteCond %{REQUEST_FILENAME} !-f
|
||||||
|
RewriteCond %{REQUEST_FILENAME} !-d
|
||||||
|
RewriteRule ^install(/(.*))?$ install.php [QSA,L]
|
||||||
|
|
||||||
|
# Rewrite all other requests for files and directories that do not exist to
|
||||||
|
# the main front controller
|
||||||
|
RewriteCond %{REQUEST_FILENAME} !-f
|
||||||
|
RewriteCond %{REQUEST_FILENAME} !-d
|
||||||
|
RewriteRule ^(.*)$ index.php [QSA,L]
|
||||||
|
</IfModule>
|
||||||
|
|
||||||
|
<IfModule !mod_rewrite.c>
|
||||||
|
# There is no mod_rewrite in the system. For the root Mibew Messenger
|
||||||
|
# directory index_fallback.php should be loaded first to activate
|
||||||
|
# old-fashioned URLs. For all other directories index.php is just a
|
||||||
|
# directory index file.
|
||||||
|
DirectoryIndex index_fallback.php index.php
|
||||||
|
</IfModule>
|
||||||
|
|
||||||
|
# Deny access to internal system files
|
||||||
|
<FilesMatch "\.(yml|po|ini|handlebars|keep)$">
|
||||||
|
Deny from all
|
||||||
|
</FilesMatch>
|
||||||
|
|
||||||
|
# Deny access to CLI cron worker from the outside
|
||||||
|
<Files "cron.php">
|
||||||
|
Deny from all
|
||||||
|
</Files>
|
||||||
|
@ -1,41 +0,0 @@
|
|||||||
Mibew Messenger
|
|
||||||
Copyright 2005-2014 the original author or authors.
|
|
||||||
|
|
||||||
REQUIREMENTS
|
|
||||||
|
|
||||||
* Apache web server 1.3.34 or above
|
|
||||||
* MySQL database 5.0 or above
|
|
||||||
* PHP 4.x or above with MySQL support
|
|
||||||
|
|
||||||
INSTALLATION
|
|
||||||
|
|
||||||
1. Create folder with name 'mibew' in the root of your website.
|
|
||||||
2. Upload all the files contained in this archive (retaining the directory structure) into created folder.
|
|
||||||
Be sure to chmod the mibew folder to 755 and the install folder to 644.
|
|
||||||
3. Add a MySQL database with the name 'mibew'
|
|
||||||
4. Edit /mibew/libs/config.php to the information needed to connect to the database
|
|
||||||
5. Using your web browser visit http://<yourdomain>/mibew/install/ and
|
|
||||||
hit 'Create tables'
|
|
||||||
6. Remove /mibew/install/ directory from your server
|
|
||||||
7. Logon as
|
|
||||||
user: admin
|
|
||||||
password: <empty>
|
|
||||||
8. Get button code and setup it on your site.
|
|
||||||
9. Change your password and name.
|
|
||||||
10. Wait for your visitors on 'Pending users' page.
|
|
||||||
|
|
||||||
On unix/linux platforms change the owner of /mibew/images/avatar folder
|
|
||||||
to the user, under which the web server is running (for instance, www).
|
|
||||||
The owner should have all rights on the folder /mibew/images/avatar
|
|
||||||
(chmod 700 /mibew/images/avatar).
|
|
||||||
|
|
||||||
UPDATE
|
|
||||||
|
|
||||||
1. Backup your /mibew/libs/config.php
|
|
||||||
2. Backup your /mibew/images/avatar folder.
|
|
||||||
3. Delete the items in the mibew folder on the server.
|
|
||||||
4. Upload all the files contained in the downloaded archive (retaining the directory structure) into mibew folder.
|
|
||||||
5. Re-edit the MySQL database settings you config.php
|
|
||||||
6. Visit http://<yourdomain>/mibew/install/ and follow the instructions to update database (if needed).
|
|
||||||
7. Remove /mibew/install/ directory from your server
|
|
||||||
8. Restore contents of /mibew/images/avatar folder.
|
|
56
src/mibew/README.txt
Normal file
@ -0,0 +1,56 @@
|
|||||||
|
Mibew Messenger
|
||||||
|
Copyright 2005-2023 the original author or authors.
|
||||||
|
|
||||||
|
REQUIREMENTS
|
||||||
|
|
||||||
|
* Apache web server 1.3.34 or above with the ability to use local .htaccess
|
||||||
|
files (mod_rewrite module is optional, but recommended)
|
||||||
|
* MySQL database 5.0 or above
|
||||||
|
* PHP 7.2.5 or above with PDO, pdo_mysql, cURL, mbstring and gd extensions
|
||||||
|
|
||||||
|
INSTALLATION
|
||||||
|
|
||||||
|
1. Create folder with name 'mibew' in the root of your website.
|
||||||
|
2. Upload all the files contained in this archive (retaining the directory
|
||||||
|
structure) into created folder.
|
||||||
|
Be sure to chmod the mibew folder to 0755.
|
||||||
|
3. Add a MySQL database with the name 'mibew'
|
||||||
|
4. Copy /mibew/configs/default_config.yml to /mibew/configs/config.yml
|
||||||
|
5. Edit /mibew/configs/config.yml to the information needed to connect to the database
|
||||||
|
6. Using your web browser visit http://<yourdomain>/mibew/install and
|
||||||
|
perform step-by-step installation.
|
||||||
|
7. Remove /mibew/install.php file from your server
|
||||||
|
8. Logon as
|
||||||
|
user: admin
|
||||||
|
password: <your password>
|
||||||
|
9. Get button code and setup it on your site.
|
||||||
|
10. Configure periodically running tasks by setting up an automated
|
||||||
|
process to visit the page http://<yourdomain>/cron?cron_key=<key>
|
||||||
|
|
||||||
|
The full URL including the secret "cron key" used to protect against
|
||||||
|
unauthorized access can be seen on the 'General' tab at the 'Settings' page.
|
||||||
|
11. Change your name.
|
||||||
|
12. Wait for your visitors on 'Pending users' page.
|
||||||
|
|
||||||
|
On unix/linux platforms change the owner of /mibew/files/avatar and
|
||||||
|
/mibew/cache folders to the user, under which the web server is running
|
||||||
|
(for instance, www). The owner should have all rights on the folders
|
||||||
|
/mibew/files/avatar and /mibew/cache
|
||||||
|
(chmod 0700 /mibew/files/avatar && chmod 0700 /mibew/cache).
|
||||||
|
|
||||||
|
UPDATE
|
||||||
|
|
||||||
|
1. Backup your actual installation (i.e. code and database).
|
||||||
|
2. Disable all plugins.
|
||||||
|
3. Delete all items in your Mibew Messenger directory on the server.
|
||||||
|
4. Unpack the archive with the official distrubition in that directory.
|
||||||
|
5. Remove install.php file.
|
||||||
|
6. Restore configuration (configs/ directory), plugins (plugins/ directory),
|
||||||
|
(maybe) custom styles (if you have any), (maybe) additional
|
||||||
|
locales (if you use any), and avatars (files/avatar/ directory) from the
|
||||||
|
backup you've made at the step 1.
|
||||||
|
7. Visit http://<yourdomain>/<path to your Mibew Messenger>/update and follow
|
||||||
|
the instructions to update the database tables (if needed).
|
||||||
|
8. Enable disabled plugins.
|
||||||
|
|
||||||
|
|
@ -1 +0,0 @@
|
|||||||
Mibew/1.6.11
|
|
1
src/mibew/VERSION.txt
Normal file
@ -0,0 +1 @@
|
|||||||
|
Mibew/3.6.0
|
@ -1,74 +0,0 @@
|
|||||||
<?php
|
|
||||||
/*
|
|
||||||
* Copyright 2005-2014 the original author or authors.
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
require_once('libs/common.php');
|
|
||||||
require_once('libs/chat.php');
|
|
||||||
require_once('libs/operator.php');
|
|
||||||
require_once('libs/groups.php');
|
|
||||||
|
|
||||||
$referer = isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : "";
|
|
||||||
if($referer && isset($_SESSION['threadid'])) {
|
|
||||||
$link = connect();
|
|
||||||
$thread = thread_by_id_($_SESSION['threadid'], $link);
|
|
||||||
if ($thread && $thread['istate'] != $state_closed) {
|
|
||||||
$msg = getstring2_("chat.client.visited.page", array($referer), $thread['locale'], true);
|
|
||||||
post_message_($thread['threadid'], $kind_for_agent,$msg,$link);
|
|
||||||
}
|
|
||||||
mysql_close($link);
|
|
||||||
}
|
|
||||||
|
|
||||||
$image = verifyparam(isset($_GET['image']) ? "image" : "i", "/^\w+$/", "mibew");
|
|
||||||
$lang = verifyparam(isset($_GET['language']) ? "language" : "lang", "/^[\w-]{2,5}$/", "");
|
|
||||||
if(!$lang || !locale_pattern_check($lang) || !locale_exists($lang)) {
|
|
||||||
$lang = $current_locale;
|
|
||||||
}
|
|
||||||
|
|
||||||
$groupid = verifyparam( "group", "/^\d{1,10}$/", "");
|
|
||||||
if($groupid) {
|
|
||||||
loadsettings();
|
|
||||||
if($settings['enablegroups'] == '1') {
|
|
||||||
$group = group_by_id($groupid);
|
|
||||||
if(!$group) {
|
|
||||||
$groupid = "";
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
$groupid = "";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$image_postfix = has_online_operators($groupid) ? "on" : "off";
|
|
||||||
$filename = dirname(__FILE__) . "/locales/${lang}/button/${image}_${image_postfix}.gif";
|
|
||||||
if (!file_exists($filename)) {
|
|
||||||
die("no image");
|
|
||||||
}
|
|
||||||
$fp = fopen($filename, 'rb') or die("unable to get image");
|
|
||||||
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
|
|
||||||
header("Cache-Control: no-store, no-cache, must-revalidate");
|
|
||||||
header("Pragma: no-cache");
|
|
||||||
header("Content-Type: image/gif");
|
|
||||||
header("Content-Length: ".filesize($filename));
|
|
||||||
if(function_exists('fpassthru')){
|
|
||||||
@fpassthru($fp);
|
|
||||||
} else {
|
|
||||||
while( (!feof($fp)) && (connection_status()==0)){
|
|
||||||
print(fread($fp, 1024*8));
|
|
||||||
flush();
|
|
||||||
}
|
|
||||||
fclose($fp);
|
|
||||||
}
|
|
||||||
exit;
|
|
||||||
?>
|
|
@ -1,182 +0,0 @@
|
|||||||
<?php
|
|
||||||
/*
|
|
||||||
* Copyright 2005-2014 the original author or authors.
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
require_once('libs/common.php');
|
|
||||||
require_once('libs/chat.php');
|
|
||||||
require_once('libs/operator.php');
|
|
||||||
require_once('libs/groups.php');
|
|
||||||
require_once('libs/expand.php');
|
|
||||||
require_once('libs/captcha.php');
|
|
||||||
require_once('libs/notify.php');
|
|
||||||
|
|
||||||
loadsettings();
|
|
||||||
if($settings['enablessl'] == "1" && $settings['forcessl'] == "1") {
|
|
||||||
if(!is_secure_request()) {
|
|
||||||
$requested = $_SERVER['PHP_SELF'];
|
|
||||||
if($_SERVER['REQUEST_METHOD'] == 'GET' && $_SERVER['QUERY_STRING']) {
|
|
||||||
header("Location: ".get_app_location(true,true)."/client.php?".$_SERVER['QUERY_STRING']);
|
|
||||||
} else {
|
|
||||||
die("only https connections are handled");
|
|
||||||
}
|
|
||||||
exit;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if( !isset($_GET['token']) || !isset($_GET['thread']) ) {
|
|
||||||
|
|
||||||
$thread = NULL;
|
|
||||||
if( isset($_SESSION['threadid']) ) {
|
|
||||||
$thread = reopen_thread($_SESSION['threadid']);
|
|
||||||
}
|
|
||||||
|
|
||||||
if( !$thread ) {
|
|
||||||
$groupid = "";
|
|
||||||
$groupname = "";
|
|
||||||
if($settings['enablegroups'] == '1') {
|
|
||||||
$groupid = verifyparam( "group", "/^\d{1,10}$/", "");
|
|
||||||
if($groupid) {
|
|
||||||
$group = group_by_id($groupid);
|
|
||||||
if(!$group) {
|
|
||||||
$groupid = "";
|
|
||||||
} else {
|
|
||||||
$groupname = get_group_name($group);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$visitor = visitor_from_request();
|
|
||||||
|
|
||||||
if(isset($_POST['survey']) && $_POST['survey'] == 'on') {
|
|
||||||
$firstmessage = getparam("message");
|
|
||||||
$info = getparam("info");
|
|
||||||
$email = getparam("email");
|
|
||||||
$referrer = urldecode(getparam("referrer"));
|
|
||||||
if ($settings["surveyaskcaptcha"] == "1") {
|
|
||||||
$captcha = getparam('captcha');
|
|
||||||
$original = isset($_SESSION["mibew_captcha"])
|
|
||||||
? $_SESSION["mibew_captcha"]
|
|
||||||
: "";
|
|
||||||
$survey_captcha_failed = empty($original)
|
|
||||||
|| empty($captcha)
|
|
||||||
|| $captcha != $original;
|
|
||||||
unset($_SESSION['mibew_captcha']);
|
|
||||||
}
|
|
||||||
|
|
||||||
if($settings['usercanchangename'] == "1" && isset($_POST['name'])) {
|
|
||||||
$newname = getparam("name");
|
|
||||||
if($newname != $visitor['name']) {
|
|
||||||
$data = strtr(base64_encode(myiconv($mibew_encoding,"utf-8",$newname)), '+/=', '-_,');
|
|
||||||
setcookie($namecookie, $data, time()+60*60*24*365);
|
|
||||||
$visitor['name'] = $newname;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
$firstmessage = NULL;
|
|
||||||
$info = getgetparam('info');
|
|
||||||
$email = getgetparam('email');
|
|
||||||
$referrer = isset($_GET['url']) ? $_GET['url'] :
|
|
||||||
(isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : "");
|
|
||||||
if(isset($_GET['referrer']) && $_GET['referrer']) {
|
|
||||||
$referrer .= "\n".$_GET['referrer'];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(!has_online_operators($groupid)) {
|
|
||||||
$page = array();
|
|
||||||
setup_logo();
|
|
||||||
setup_leavemessage($visitor['name'],$email,$firstmessage,$groupid,$groupname,$info,$referrer,can_show_captcha());
|
|
||||||
expand("styles", getchatstyle(), "leavemessage.tpl");
|
|
||||||
exit;
|
|
||||||
}
|
|
||||||
|
|
||||||
$show_survey = $settings['enablepresurvey'] == '1'
|
|
||||||
&& (
|
|
||||||
!(isset($_POST['survey']) && $_POST['survey'] == 'on')
|
|
||||||
|| ($settings["surveyaskcaptcha"] == "1" && !empty($survey_captcha_failed))
|
|
||||||
);
|
|
||||||
if($show_survey) {
|
|
||||||
$page = array();
|
|
||||||
setup_logo();
|
|
||||||
if (!empty($survey_captcha_failed)) {
|
|
||||||
$errors[] = getlocal('errors.captcha');
|
|
||||||
}
|
|
||||||
setup_survey($visitor['name'], $email, $groupid, $info, $referrer, can_show_captcha());
|
|
||||||
expand("styles", getchatstyle(), "survey.tpl");
|
|
||||||
exit;
|
|
||||||
}
|
|
||||||
|
|
||||||
$remoteHost = get_remote_host();
|
|
||||||
$userbrowser = $_SERVER['HTTP_USER_AGENT'];
|
|
||||||
|
|
||||||
$link = connect();
|
|
||||||
if(!check_connections_from_remote($remoteHost, $link)) {
|
|
||||||
mysql_close($link);
|
|
||||||
die("number of connections from your IP is exceeded, try again later");
|
|
||||||
}
|
|
||||||
$thread = create_thread($groupid,$visitor['name'], $remoteHost, $referrer,$current_locale,$visitor['id'], $userbrowser,$state_loading,$link);
|
|
||||||
$_SESSION['threadid'] = $thread['threadid'];
|
|
||||||
|
|
||||||
if( $referrer ) {
|
|
||||||
post_message_($thread['threadid'],$kind_for_agent,getstring2('chat.came.from',array($referrer),true),$link);
|
|
||||||
}
|
|
||||||
post_message_($thread['threadid'],$kind_info,getstring('chat.wait', true),$link);
|
|
||||||
if($email) {
|
|
||||||
post_message_($thread['threadid'],$kind_for_agent,getstring2('chat.visitor.email',array($email),true),$link);
|
|
||||||
}
|
|
||||||
if($info) {
|
|
||||||
post_message_($thread['threadid'],$kind_for_agent,getstring2('chat.visitor.info',array($info),true),$link);
|
|
||||||
}
|
|
||||||
if($firstmessage) {
|
|
||||||
$postedid = post_message_($thread['threadid'],$kind_user,$firstmessage,$link,$visitor['name']);
|
|
||||||
if ($postedid) {
|
|
||||||
commit_thread( $thread['threadid'], array('shownmessageid' => intval($postedid)), $link);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
notify_operators($thread, $firstmessage, $link);
|
|
||||||
mysql_close($link);
|
|
||||||
}
|
|
||||||
$threadid = $thread['threadid'];
|
|
||||||
$token = $thread['ltoken'];
|
|
||||||
$level = get_remote_level($_SERVER['HTTP_USER_AGENT']);
|
|
||||||
$chatstyle = verifyparam( "style", "/^\w+$/", "");
|
|
||||||
header("Location: $mibewroot/client.php?thread=$threadid&token=$token&level=$level".($chatstyle ? "&style=$chatstyle" : ""));
|
|
||||||
exit;
|
|
||||||
}
|
|
||||||
|
|
||||||
$token = verifyparam( "token", "/^\d{1,10}$/");
|
|
||||||
$threadid = verifyparam( "thread", "/^\d{1,10}$/");
|
|
||||||
$level = verifyparam( "level", "/^(ajaxed|simple|old)$/");
|
|
||||||
|
|
||||||
$thread = thread_by_id($threadid);
|
|
||||||
if( !$thread || !isset($thread['ltoken']) || $token != $thread['ltoken'] ) {
|
|
||||||
die("wrong thread");
|
|
||||||
}
|
|
||||||
|
|
||||||
setup_chatview_for_user($thread, $level);
|
|
||||||
|
|
||||||
$pparam = verifyparam( "act", "/^(mailthread)$/", "default");
|
|
||||||
if( $pparam == "mailthread" ) {
|
|
||||||
expand("styles", getchatstyle(), "mail.tpl");
|
|
||||||
} else if( $level == "ajaxed" ) {
|
|
||||||
expand("styles", getchatstyle(), "chat.tpl");
|
|
||||||
} else if( $level == "simple" ) {
|
|
||||||
expand("styles", getchatstyle(), "chatsimple.tpl");
|
|
||||||
} else if( $level == "old" ) {
|
|
||||||
expand("styles", getchatstyle(), "nochat.tpl");
|
|
||||||
}
|
|
||||||
|
|
||||||
?>
|
|
336
src/mibew/configs/database_schema.yml
Normal file
@ -0,0 +1,336 @@
|
|||||||
|
# This file contains current database schema that is used for installation.
|
||||||
|
# Do not change anything in this file unless you know what you are doing!
|
||||||
|
|
||||||
|
# Contains information about chat groups. This table cannot be named just
|
||||||
|
# "group" because it is reserved SQL word.
|
||||||
|
opgroup:
|
||||||
|
fields:
|
||||||
|
groupid: "int NOT NULL auto_increment PRIMARY KEY"
|
||||||
|
parent: "int DEFAULT NULL"
|
||||||
|
vcemail: "varchar(64)"
|
||||||
|
vclocalname: "varchar(64) NOT NULL"
|
||||||
|
vccommonname: "varchar(64) NOT NULL"
|
||||||
|
vclocaldescription: "varchar(1024) NOT NULL"
|
||||||
|
vccommondescription: "varchar(1024) NOT NULL"
|
||||||
|
iweight: "int NOT NULL DEFAULT 0"
|
||||||
|
vctitle: "varchar(255) DEFAULT ''"
|
||||||
|
vcchattitle: "varchar(255) DEFAULT ''"
|
||||||
|
vclogo: "varchar(255) DEFAULT ''"
|
||||||
|
vchosturl: "varchar(255) DEFAULT ''"
|
||||||
|
indexes:
|
||||||
|
parent: [parent]
|
||||||
|
|
||||||
|
# Contains info about chat threads
|
||||||
|
thread:
|
||||||
|
fields:
|
||||||
|
# ID of the thread.
|
||||||
|
threadid: "int NOT NULL auto_increment PRIMARY KEY"
|
||||||
|
# Name of the user in chat.
|
||||||
|
username: "varchar(64) NOT NULL"
|
||||||
|
# ID of the user. This field is foreign key for {sitevisitor}.userid
|
||||||
|
userid: "varchar(255)"
|
||||||
|
# Name of the operator who took place in the chat.
|
||||||
|
agentname: "varchar(64)"
|
||||||
|
# ID of the operator who took place in the chat.
|
||||||
|
agentid: "int NOT NULL DEFAULT 0"
|
||||||
|
# Unix timestamp of the moment when the thread was created.
|
||||||
|
dtmcreated: "int NOT NULL DEFAULT 0"
|
||||||
|
# Unix timestamp of the moment when chat actually started.
|
||||||
|
dtmchatstarted: "int NOT NULL DEFAULT 0"
|
||||||
|
# Unix timestamp of the last thread modification.
|
||||||
|
dtmmodified: "int NOT NULL DEFAULT 0"
|
||||||
|
# Unix timestamp of the moment when the thread was closed.
|
||||||
|
dtmclosed: "int NOT NULL DEFAULT 0"
|
||||||
|
# ID of the last thread revision.
|
||||||
|
lrevision: "int NOT NULL DEFAULT 0"
|
||||||
|
# State of the thread. It is one of Thread::STATE_* constants.
|
||||||
|
istate: "int NOT NULL DEFAULT 0"
|
||||||
|
# State of invitation related with the thread. It is one of
|
||||||
|
# Thread::INVITATION_* constants.
|
||||||
|
invitationstate: "int NOT NULL DEFAULT 0"
|
||||||
|
# Last token of the thread.
|
||||||
|
ltoken: "int NOT NULL"
|
||||||
|
# IP address of the user.
|
||||||
|
remote: "varchar(255)"
|
||||||
|
# Page from which chat thread was started.
|
||||||
|
referer: "text"
|
||||||
|
# ID of the operator who will next in the chat.
|
||||||
|
nextagent: "int NOT NULL DEFAULT 0"
|
||||||
|
# Code of chat locale.
|
||||||
|
locale: "varchar(8)"
|
||||||
|
# Unix timestamp of the last request from user's window to server.
|
||||||
|
lastpinguser: "int NOT NULL DEFAULT 0"
|
||||||
|
# Unix timestamp of the last request from operator's window to server.
|
||||||
|
lastpingagent: "int NOT NULL DEFAULT 0"
|
||||||
|
# Indicates if user typing or not. It can take two values 0 and 1.
|
||||||
|
usertyping: "int DEFAULT 0"
|
||||||
|
# Indicates if operator typing or not. It can take two values 0 and 1.
|
||||||
|
agenttyping: "int DEFAULT 0"
|
||||||
|
# ID of shown message in the chat.
|
||||||
|
shownmessageid: "int NOT NULL DEFAULT 0"
|
||||||
|
# User agent description that took from 'User-Agent' HTTP header.
|
||||||
|
useragent: "varchar(255)"
|
||||||
|
# Total count of user's messages related with the thread.
|
||||||
|
messagecount: "varchar(16)"
|
||||||
|
# ID of the group at Mibew Messenger side related with the thread.
|
||||||
|
groupid: "int references {opgroup}(groupid)"
|
||||||
|
|
||||||
|
# Contains "by thread" statistics
|
||||||
|
threadstatistics:
|
||||||
|
fields:
|
||||||
|
statid: "int NOT NULL auto_increment PRIMARY KEY"
|
||||||
|
date: "int NOT NULL DEFAULT 0"
|
||||||
|
threads: "int NOT NULL DEFAULT 0"
|
||||||
|
missedthreads: "int NOT NULL DEFAULT 0"
|
||||||
|
sentinvitations: "int NOT NULL DEFAULT 0"
|
||||||
|
acceptedinvitations: "int NOT NULL DEFAULT 0"
|
||||||
|
rejectedinvitations: "int NOT NULL DEFAULT 0"
|
||||||
|
ignoredinvitations: "int NOT NULL DEFAULT 0"
|
||||||
|
operatormessages: "int NOT NULL DEFAULT 0"
|
||||||
|
usermessages: "int NOT NULL DEFAULT 0"
|
||||||
|
averagewaitingtime: "FLOAT(10, 1) NOT NULL DEFAULT 0"
|
||||||
|
averagechattime: "FLOAT(10, 1) NOT NULL DEFAULT 0"
|
||||||
|
|
||||||
|
requestbuffer:
|
||||||
|
fields:
|
||||||
|
requestid: "int NOT NULL auto_increment PRIMARY KEY"
|
||||||
|
# Use MD5 hashes as keys
|
||||||
|
requestkey: "char(32) NOT NULL"
|
||||||
|
request: "text NOT NULL"
|
||||||
|
indexes:
|
||||||
|
requestkey: [requestkey]
|
||||||
|
|
||||||
|
requestcallback:
|
||||||
|
fields:
|
||||||
|
callbackid: "int NOT NULL auto_increment PRIMARY KEY"
|
||||||
|
token: "varchar(64) NOT NULL DEFAULT ''"
|
||||||
|
func: "varchar(64) NOT NULL"
|
||||||
|
arguments: "varchar(1024)"
|
||||||
|
indexes:
|
||||||
|
token: [token]
|
||||||
|
|
||||||
|
# Contains updated translations
|
||||||
|
translation:
|
||||||
|
fields:
|
||||||
|
translationid: "int NOT NULL auto_increment PRIMARY KEY"
|
||||||
|
locale: "varchar(5) NOT NULL"
|
||||||
|
context: "varchar(256) NOT NULL DEFAULT ''"
|
||||||
|
source: "text COLLATE utf8_bin"
|
||||||
|
translation: "text"
|
||||||
|
# An artificial unique key for the record. It is needed to avoid
|
||||||
|
# duplication of translation strings. The field contains SHA-1 hash of
|
||||||
|
# combination of locale, context and source fields. Native MySQL unique
|
||||||
|
# keys cannot be applied to them because "source" field has text data
|
||||||
|
# type.
|
||||||
|
hash: "char(40) NOT NULL"
|
||||||
|
unique_keys:
|
||||||
|
hash: [hash]
|
||||||
|
|
||||||
|
# Contains locales info
|
||||||
|
locale:
|
||||||
|
fields:
|
||||||
|
# Artificial primary key.
|
||||||
|
localeid: "int NOT NULL auto_increment PRIMARY KEY"
|
||||||
|
# Locale code
|
||||||
|
code: "varchar(5) NOT NULL"
|
||||||
|
# Human readable name of the locale.
|
||||||
|
name: "varchar(128) NOT NULL DEFAULT ''"
|
||||||
|
# Indicates if the locale is enabled or not.
|
||||||
|
enabled: "tinyint NOT NULL DEFAULT 0"
|
||||||
|
# Indicates if the locale uses RTL writing.
|
||||||
|
rtl: "tinyint NOT NULL DEFAULT 0"
|
||||||
|
# Name of the locale which is used with PHP's setlocale to format dates.
|
||||||
|
time_locale: "varchar(128) NOT NULL DEFAULT 'en_US'"
|
||||||
|
# Serialized array of various date formats.
|
||||||
|
date_format: "text"
|
||||||
|
unique_keys:
|
||||||
|
# Make sure locale code can be duplicated
|
||||||
|
code: [code]
|
||||||
|
|
||||||
|
# Contains localized mail templates
|
||||||
|
mailtemplate:
|
||||||
|
fields:
|
||||||
|
# Artificial primary key
|
||||||
|
templateid: "int NOT NULL auto_increment PRIMARY KEY"
|
||||||
|
# Locale code a template belongs to
|
||||||
|
locale: "varchar(5) NOT NULL"
|
||||||
|
# Machine name of a template
|
||||||
|
name: "varchar(256) NOT NULL"
|
||||||
|
# Mail subject
|
||||||
|
subject: "varchar(1024) NOT NULL"
|
||||||
|
# Mail body
|
||||||
|
body: "text"
|
||||||
|
|
||||||
|
# Store chat thread messages
|
||||||
|
message:
|
||||||
|
fields:
|
||||||
|
# Message ID.
|
||||||
|
messageid: "int NOT NULL auto_increment PRIMARY KEY"
|
||||||
|
# ID of the thread related with the message.
|
||||||
|
threadid: "int NOT NULL references {thread}(threadid)"
|
||||||
|
# Message kind. It is one of Thread::KIND_* constants.
|
||||||
|
ikind: "int NOT NULL"
|
||||||
|
# ID of operator who sent the message. This value will be ignored for
|
||||||
|
# system messages and messages which sent by users.
|
||||||
|
agentid: "int NOT NULL DEFAULT 0"
|
||||||
|
# Message text body.
|
||||||
|
tmessage: "text NOT NULL"
|
||||||
|
# Name of the plugin which sent the message. If message was not sent by
|
||||||
|
# a plugin this field equals to an empty string.
|
||||||
|
plugin: "varchar(256) NOT NULL DEFAULT ''"
|
||||||
|
# Arbitrary serialized data related with message.
|
||||||
|
data: "text"
|
||||||
|
# Unix timestamp when message was created.
|
||||||
|
dtmcreated: "int NOT NULL DEFAULT 0"
|
||||||
|
# Name of the message sender.
|
||||||
|
tname: "varchar(64)"
|
||||||
|
indexes:
|
||||||
|
idx_agentid: [agentid]
|
||||||
|
|
||||||
|
# Contains info about operators
|
||||||
|
operator:
|
||||||
|
fields:
|
||||||
|
operatorid: "int NOT NULL auto_increment PRIMARY KEY"
|
||||||
|
vclogin: "varchar(64) NOT NULL"
|
||||||
|
vcpassword: "varchar(64) NOT NULL"
|
||||||
|
vclocalename: "varchar(64) NOT NULL"
|
||||||
|
vccommonname: "varchar(64) NOT NULL"
|
||||||
|
vcemail: "varchar(64)"
|
||||||
|
dtmlastvisited: "int NOT NULL DEFAULT 0"
|
||||||
|
# Current status of an operator: 0 - online, 1 - away
|
||||||
|
istatus: "int DEFAULT 0"
|
||||||
|
idisabled: "int DEFAULT 0"
|
||||||
|
vcavatar: "varchar(255)"
|
||||||
|
# Operators privileges bitmask.
|
||||||
|
iperm: "int DEFAULT 0"
|
||||||
|
dtmrestore: "int NOT NULL DEFAULT 0"
|
||||||
|
vcrestoretoken: "varchar(64)"
|
||||||
|
# Use to start chat with specified operator.
|
||||||
|
code: "varchar(64) DEFAULT ''"
|
||||||
|
|
||||||
|
# Contains "by operator" statistics
|
||||||
|
operatorstatistics:
|
||||||
|
fields:
|
||||||
|
statid: "int NOT NULL auto_increment PRIMARY KEY"
|
||||||
|
date: "int NOT NULL DEFAULT 0"
|
||||||
|
operatorid: "int NOT NULL"
|
||||||
|
threads: "int NOT NULL DEFAULT 0"
|
||||||
|
messages: "int NOT NULL DEFAULT 0"
|
||||||
|
averagelength: "FLOAT(10, 1) NOT NULL DEFAULT 0"
|
||||||
|
sentinvitations: "int NOT NULL DEFAULT 0"
|
||||||
|
acceptedinvitations: "int NOT NULL DEFAULT 0"
|
||||||
|
rejectedinvitations: "int NOT NULL DEFAULT 0"
|
||||||
|
ignoredinvitations: "int NOT NULL DEFAULT 0"
|
||||||
|
indexes:
|
||||||
|
operatorid: [operatorid]
|
||||||
|
|
||||||
|
revision:
|
||||||
|
fields:
|
||||||
|
id: "INT NOT NULL PRIMARY KEY"
|
||||||
|
|
||||||
|
# Contains relations between operators and groups
|
||||||
|
operatortoopgroup:
|
||||||
|
fields:
|
||||||
|
groupid: "int NOT NULL references {opgroup}(groupid)"
|
||||||
|
operatorid: "int NOT NULL references {operator}(operatorid)"
|
||||||
|
indexes:
|
||||||
|
groupid: [groupid]
|
||||||
|
operatorid: [operatorid]
|
||||||
|
|
||||||
|
# Contains banned visitors
|
||||||
|
ban:
|
||||||
|
fields:
|
||||||
|
banid: "INT NOT NULL auto_increment PRIMARY KEY"
|
||||||
|
dtmcreated: "int NOT NULL DEFAULT 0"
|
||||||
|
dtmtill: "int NOT NULL DEFAULT 0"
|
||||||
|
address: "varchar(255)"
|
||||||
|
comment: "varchar(255)"
|
||||||
|
|
||||||
|
# Contains dynamic configs
|
||||||
|
config:
|
||||||
|
fields:
|
||||||
|
id: "INT NOT NULL auto_increment PRIMARY KEY"
|
||||||
|
vckey: "varchar(255)"
|
||||||
|
vcvalue: "varchar(255)"
|
||||||
|
|
||||||
|
# Contains canned messages
|
||||||
|
cannedmessage:
|
||||||
|
fields:
|
||||||
|
id: "INT NOT NULL auto_increment PRIMARY KEY"
|
||||||
|
locale: "varchar(8)"
|
||||||
|
groupid: "int references {opgroup}(groupid)"
|
||||||
|
vctitle: "varchar(100) NOT NULL DEFAULT ''"
|
||||||
|
vcvalue: "varchar(1024) NOT NULL"
|
||||||
|
|
||||||
|
sitevisitor:
|
||||||
|
fields:
|
||||||
|
visitorid: "INT NOT NULL auto_increment PRIMARY KEY"
|
||||||
|
userid: "varchar(255) NOT NULL"
|
||||||
|
username: "varchar(64)"
|
||||||
|
firsttime: "int NOT NULL DEFAULT 0"
|
||||||
|
lasttime: "int NOT NULL DEFAULT 0"
|
||||||
|
entry: "text NOT NULL"
|
||||||
|
details: "text NOT NULL"
|
||||||
|
invitations: "INT NOT NULL DEFAULT 0"
|
||||||
|
chats: "INT NOT NULL DEFAULT 0"
|
||||||
|
threadid: "INT references {thread}(threadid) on delete set null"
|
||||||
|
indexes:
|
||||||
|
threadid: [threadid]
|
||||||
|
|
||||||
|
visitedpage:
|
||||||
|
fields:
|
||||||
|
pageid: "INT NOT NULL auto_increment PRIMARY KEY"
|
||||||
|
address: "varchar(1024)"
|
||||||
|
visittime: "int NOT NULL DEFAULT 0"
|
||||||
|
visitorid: "INT"
|
||||||
|
# Indicates if path included in 'by page' statistics
|
||||||
|
calculated: "tinyint NOT NULL DEFAULT 0"
|
||||||
|
indexes:
|
||||||
|
visitorid: [visitorid]
|
||||||
|
|
||||||
|
# Contains "by page" statistics
|
||||||
|
visitedpagestatistics:
|
||||||
|
fields:
|
||||||
|
pageid: "INT NOT NULL auto_increment PRIMARY KEY"
|
||||||
|
date: "int NOT NULL DEFAULT 0"
|
||||||
|
address: "varchar(1024)"
|
||||||
|
visits: "int NOT NULL DEFAULT 0"
|
||||||
|
chats: "int NOT NULL DEFAULT 0"
|
||||||
|
sentinvitations: "int NOT NULL DEFAULT 0"
|
||||||
|
acceptedinvitations: "int NOT NULL DEFAULT 0"
|
||||||
|
rejectedinvitations: "int NOT NULL DEFAULT 0"
|
||||||
|
ignoredinvitations: "int NOT NULL DEFAULT 0"
|
||||||
|
|
||||||
|
# Contains info about installed plugins
|
||||||
|
plugin:
|
||||||
|
fields:
|
||||||
|
# Artificial ID
|
||||||
|
id: "INT NOT NULL auto_increment PRIMARY KEY"
|
||||||
|
# Plugin name in "<Vendor>:<Name>" format.
|
||||||
|
name: "varchar(255) NOT NULL"
|
||||||
|
# Installed version of the plugin.
|
||||||
|
version: "varchar(255) NOT NULL"
|
||||||
|
# Indicates if the plugin is installed or not.
|
||||||
|
installed: "tinyint NOT NULL DEFAULT 0"
|
||||||
|
# Indicates if the plugin is enabled or not.
|
||||||
|
enabled: "tinyint NOT NULL DEFAULT 0"
|
||||||
|
# Indicates if the plugin is initialized or not.
|
||||||
|
initialized: "tinyint NOT NULL DEFAULT 0"
|
||||||
|
unique_keys:
|
||||||
|
name: [name]
|
||||||
|
|
||||||
|
# Contains info about all available updates
|
||||||
|
availableupdate:
|
||||||
|
fields:
|
||||||
|
# Artificial ID
|
||||||
|
id: "INT NOT NULL auto_increment PRIMARY KEY"
|
||||||
|
# Can be either "core" or fully qualified plugin's name
|
||||||
|
target: "varchar(255) NOT NULL"
|
||||||
|
# The latest available version of the plugin
|
||||||
|
version: "varchar(255) NOT NULL"
|
||||||
|
# A URL where the new version can be downloaded
|
||||||
|
url: "text"
|
||||||
|
# Description of the update
|
||||||
|
description: "text"
|
||||||
|
unique_keys:
|
||||||
|
target: [target]
|
98
src/mibew/configs/default_config.yml
Normal file
@ -0,0 +1,98 @@
|
|||||||
|
# IMPORTANT: Before install Mibew Messenger copy this file to config.yml and
|
||||||
|
# fill it with your own settings!
|
||||||
|
|
||||||
|
|
||||||
|
# MySQL Database parameters
|
||||||
|
database:
|
||||||
|
host: ""
|
||||||
|
port: 3306
|
||||||
|
db: ""
|
||||||
|
login: ""
|
||||||
|
pass: ""
|
||||||
|
tables_prefix: ""
|
||||||
|
use_persistent_connection: false
|
||||||
|
|
||||||
|
# Mail
|
||||||
|
## This value will be used as sender address in all e-mails Mibew Messenger send.
|
||||||
|
mailbox: mibew@yourdomain.com
|
||||||
|
|
||||||
|
## Mailer parameters
|
||||||
|
mailer:
|
||||||
|
# This value determines what kind of mailer will be used. Possible values
|
||||||
|
# are "mail" and "smtp".
|
||||||
|
#
|
||||||
|
# To use standard PHP mail function just set this option to "mail". No
|
||||||
|
# additional configs are required in this case.
|
||||||
|
#
|
||||||
|
# To use SMTP-based solution set this option "smtp". This approach require
|
||||||
|
# some extra configuration to be done (see below).
|
||||||
|
transport: mail
|
||||||
|
|
||||||
|
# The lines below represents default SMTP mailer configurations. They will
|
||||||
|
# be used only if the "transport" option is set to "smtp".
|
||||||
|
host: localhost
|
||||||
|
port: 25
|
||||||
|
user: user
|
||||||
|
pass: ""
|
||||||
|
# The following option determines what kind of encryption should be used.
|
||||||
|
# false means no encyption at all. Another values once can use are "ssl" and
|
||||||
|
# "tls".
|
||||||
|
encryption: false
|
||||||
|
|
||||||
|
# Cache subsystem
|
||||||
|
cache:
|
||||||
|
# This value determines where the cached data will be stored. Possible
|
||||||
|
# values are "none", "file_system" and "memcached".
|
||||||
|
#
|
||||||
|
# If "none" is used the caching will be disabled. This option should be used
|
||||||
|
# only if none of the other options works.
|
||||||
|
#
|
||||||
|
# If "file_system" is used the cached data will be stored in files within
|
||||||
|
# the "cache/" directory. Notice, that the file system storage does not work
|
||||||
|
# on NFS systems bucause exclusive file locks are not supported where.
|
||||||
|
#
|
||||||
|
# If "memcached" is used the cached data will be stored in Memcached
|
||||||
|
# storage. Before using this kind of storage make sure PHP's memcached
|
||||||
|
# extension is installed and enabled.
|
||||||
|
storage: file_system
|
||||||
|
|
||||||
|
# The lines below represents default Memcached server configurations. They
|
||||||
|
# will be used only if the "storage" option is set to "memcached".
|
||||||
|
memcached_servers:
|
||||||
|
- host: localhost
|
||||||
|
port: 11211
|
||||||
|
# The "weight" field is optional and can be omitted and it's only positive int number.
|
||||||
|
weight: 1
|
||||||
|
# Actually, one can use any number of memcached servers he wants. Just
|
||||||
|
# add servers description like the one above.
|
||||||
|
|
||||||
|
# Locales
|
||||||
|
## Native name will be used in this locale
|
||||||
|
home_locale: en
|
||||||
|
## If user does not provide known lang
|
||||||
|
default_locale: en
|
||||||
|
|
||||||
|
# A timezone to use. Leave this value empty to use the default timezone from the
|
||||||
|
# system settings. For the details about available timezones see
|
||||||
|
# http://php.net/manual/en/timezones.php
|
||||||
|
timezone: ""
|
||||||
|
|
||||||
|
# List of proxy's IP Mibew Messenger should trust. You should set this option
|
||||||
|
# if you use Mibew Messenger with a load balancer or behind a proxy.
|
||||||
|
trusted_proxies: []
|
||||||
|
# Here is an example of what values this option can take:
|
||||||
|
# trusted_proxies:
|
||||||
|
# - 127.0.0.1
|
||||||
|
# - ::1
|
||||||
|
# - 10.0.0.0/8
|
||||||
|
|
||||||
|
# Plugins
|
||||||
|
plugins: []
|
||||||
|
|
||||||
|
## Example of plugins configuration
|
||||||
|
# plugins:
|
||||||
|
# "VendorName:PluginName":
|
||||||
|
# weight: 100
|
||||||
|
# some_configurable_value: value
|
||||||
|
# "VendorName:AnotherPluginName":
|
||||||
|
# very_important_value: "$3.50"
|
829
src/mibew/configs/routing.yml
Normal file
@ -0,0 +1,829 @@
|
|||||||
|
# Chat actions
|
||||||
|
chat_thread_update:
|
||||||
|
path: /thread/update
|
||||||
|
defaults:
|
||||||
|
_controller: Mibew\Controller\Chat\ThreadController::updateAction
|
||||||
|
|
||||||
|
## Operator's chat
|
||||||
|
chat_operator:
|
||||||
|
path: /operator/chat/{thread_id}/{token}
|
||||||
|
defaults:
|
||||||
|
_controller: Mibew\Controller\Chat\OperatorChatController::indexAction
|
||||||
|
_access_check: Mibew\AccessControl\Check\LoggedInCheck
|
||||||
|
requirements:
|
||||||
|
thread_id: \d{1,10}
|
||||||
|
token: \d{1,10}
|
||||||
|
|
||||||
|
chat_operator_redirect:
|
||||||
|
path: /operator/chat/{thread_id}/{token}/redirect
|
||||||
|
defaults:
|
||||||
|
_controller: Mibew\Controller\Chat\RedirectController::redirectAction
|
||||||
|
_access_check: Mibew\AccessControl\Check\LoggedInCheck
|
||||||
|
requirements:
|
||||||
|
thread_id: \d{1,10}
|
||||||
|
token: \d{1,10}
|
||||||
|
|
||||||
|
chat_operator_start:
|
||||||
|
path: /operator/chat/{thread_id}
|
||||||
|
defaults:
|
||||||
|
_controller: Mibew\Controller\Chat\OperatorChatController::startAction
|
||||||
|
_access_check: Mibew\AccessControl\Check\LoggedInCheck
|
||||||
|
requirements:
|
||||||
|
thread_id: \d{1,10}
|
||||||
|
|
||||||
|
chat_operator_redirection_links:
|
||||||
|
path: /operator/chat/{thread_id}/{token}/redirection-links
|
||||||
|
defaults:
|
||||||
|
_controller: Mibew\Controller\Chat\RedirectController::showRedirectionLinksAction
|
||||||
|
_access_check: Mibew\AccessControl\Check\LoggedInCheck
|
||||||
|
requirements:
|
||||||
|
thread_id: \d{1,10}
|
||||||
|
token: \d{1,10}
|
||||||
|
|
||||||
|
## User's chat
|
||||||
|
chat_user:
|
||||||
|
path: /chat/{thread_id}/{token}
|
||||||
|
defaults:
|
||||||
|
_controller: Mibew\Controller\Chat\UserChatController::indexAction
|
||||||
|
requirements:
|
||||||
|
thread_id: \d{1,10}
|
||||||
|
token: \d{1,10}
|
||||||
|
|
||||||
|
chat_user_check:
|
||||||
|
path: /chat/{thread_id}/{token}/check
|
||||||
|
defaults:
|
||||||
|
_controller: Mibew\Controller\Chat\UserChatController::checkAction
|
||||||
|
requirements:
|
||||||
|
thread_id: \d{1,10}
|
||||||
|
token: \d{1,10}
|
||||||
|
|
||||||
|
chat_user_invitation:
|
||||||
|
path: /chat/invitation
|
||||||
|
defaults:
|
||||||
|
_controller: Mibew\Controller\Chat\UserChatController::invitationAction
|
||||||
|
|
||||||
|
chat_user_mail:
|
||||||
|
path: /chat/{thread_id}/{token}/mail
|
||||||
|
defaults:
|
||||||
|
_controller: Mibew\Controller\Chat\MailController::showFormAction
|
||||||
|
requirements:
|
||||||
|
thread_id: \d{1,10}
|
||||||
|
token: \d{1,10}
|
||||||
|
methods: [GET]
|
||||||
|
|
||||||
|
chat_user_mail_send:
|
||||||
|
path: /chat/{thread_id}/{token}/mail
|
||||||
|
defaults:
|
||||||
|
_controller: Mibew\Controller\Chat\MailController::submitFormAction
|
||||||
|
requirements:
|
||||||
|
thread_id: \d{1,10}
|
||||||
|
token: \d{1,10}
|
||||||
|
methods: [POST]
|
||||||
|
|
||||||
|
chat_user_popup_style:
|
||||||
|
path: /chat/style/popup/{style}
|
||||||
|
defaults:
|
||||||
|
_controller: Mibew\Controller\Chat\StyleController::loadPopupStyleAction
|
||||||
|
style: ""
|
||||||
|
requirements:
|
||||||
|
style: "[0-9A-Za-z_]*"
|
||||||
|
|
||||||
|
chat_user_popup_style_force_secure:
|
||||||
|
path: /chat/style/popup/{style}/force_secure
|
||||||
|
defaults:
|
||||||
|
_controller: Mibew\Controller\Chat\StyleController::loadPopupStyleAction
|
||||||
|
style: ""
|
||||||
|
force_secure: on
|
||||||
|
requirements:
|
||||||
|
style: "[0-9A-Za-z_]*"
|
||||||
|
|
||||||
|
chat_user_start:
|
||||||
|
path: /chat
|
||||||
|
defaults:
|
||||||
|
_controller: Mibew\Controller\Chat\UserChatController::startAction
|
||||||
|
|
||||||
|
chat_user_cookie_set_permission:
|
||||||
|
path: /chat/cookies-set-permission
|
||||||
|
defaults:
|
||||||
|
_controller: Mibew\Controller\Chat\UserChatController::cookieSetPermissionAction
|
||||||
|
|
||||||
|
# Pages that are available for all users
|
||||||
|
button:
|
||||||
|
path: /b
|
||||||
|
defaults: { _controller: Mibew\Controller\ButtonController::indexAction }
|
||||||
|
|
||||||
|
captcha:
|
||||||
|
path: /captcha
|
||||||
|
defaults: { _controller: Mibew\Controller\CaptchaController::drawAction }
|
||||||
|
|
||||||
|
cron:
|
||||||
|
path: /cron
|
||||||
|
defaults: { _controller: Mibew\Controller\CronController::runAction }
|
||||||
|
|
||||||
|
# A set of localization constants for the client side applications is generated
|
||||||
|
# dynamically
|
||||||
|
js_translation:
|
||||||
|
path: /locales/{locale}/translation.js
|
||||||
|
defaults:
|
||||||
|
_controller: Mibew\Controller\Localization\JsTranslationController::indexAction
|
||||||
|
|
||||||
|
widget_gateway:
|
||||||
|
path: /widget
|
||||||
|
defaults: { _controller: Mibew\Controller\WidgetController::indexAction }
|
||||||
|
|
||||||
|
# Operators' pages
|
||||||
|
|
||||||
|
## About page
|
||||||
|
about:
|
||||||
|
path: /operator/about
|
||||||
|
defaults:
|
||||||
|
_controller: Mibew\Controller\AboutController::indexAction
|
||||||
|
_access_check: Mibew\AccessControl\Check\LoggedInCheck
|
||||||
|
|
||||||
|
## Banned visitors
|
||||||
|
ban_add:
|
||||||
|
path: /operator/ban/add
|
||||||
|
defaults:
|
||||||
|
_controller: Mibew\Controller\BanController::showEditFormAction
|
||||||
|
_access_check: Mibew\AccessControl\Check\LoggedInCheck
|
||||||
|
methods: [GET]
|
||||||
|
|
||||||
|
ban_add_save:
|
||||||
|
path: /operator/ban/add
|
||||||
|
defaults:
|
||||||
|
_controller: Mibew\Controller\BanController::submitEditFormAction
|
||||||
|
_access_check: Mibew\AccessControl\Check\LoggedInCheck
|
||||||
|
methods: [POST]
|
||||||
|
|
||||||
|
ban_delete:
|
||||||
|
path: /operator/ban/{ban_id}/delete
|
||||||
|
defaults:
|
||||||
|
_controller: Mibew\Controller\BanController::deleteAction
|
||||||
|
_access_check: Mibew\AccessControl\Check\LoggedInCheck
|
||||||
|
requirements:
|
||||||
|
ban_id: \d{1,10}
|
||||||
|
|
||||||
|
ban_edit:
|
||||||
|
path: /operator/ban/{ban_id}/edit
|
||||||
|
defaults:
|
||||||
|
_controller: Mibew\Controller\BanController::showEditFormAction
|
||||||
|
_access_check: Mibew\AccessControl\Check\LoggedInCheck
|
||||||
|
requirements:
|
||||||
|
ban_id: \d{1,10}
|
||||||
|
methods: [GET]
|
||||||
|
|
||||||
|
ban_edit_save:
|
||||||
|
path: /operator/ban/{ban_id}/edit
|
||||||
|
defaults:
|
||||||
|
_controller: Mibew\Controller\BanController::submitEditFormAction
|
||||||
|
_access_check: Mibew\AccessControl\Check\LoggedInCheck
|
||||||
|
requirements:
|
||||||
|
ban_id: \d{1,10}
|
||||||
|
methods: [POST]
|
||||||
|
|
||||||
|
bans:
|
||||||
|
path: /operator/ban
|
||||||
|
defaults:
|
||||||
|
_controller: Mibew\Controller\BanController::indexAction
|
||||||
|
_access_check: Mibew\AccessControl\Check\LoggedInCheck
|
||||||
|
|
||||||
|
## Button code
|
||||||
|
button_code:
|
||||||
|
path: /operator/button-code
|
||||||
|
defaults:
|
||||||
|
_controller: Mibew\Controller\ButtonCodeController::generateAction
|
||||||
|
_access_check: Mibew\AccessControl\Check\PermissionsCheck
|
||||||
|
_access_permissions: [CAN_ADMINISTRATE]
|
||||||
|
|
||||||
|
## Canned messages
|
||||||
|
canned_message_add:
|
||||||
|
path: /operator/canned-message/add
|
||||||
|
defaults:
|
||||||
|
_controller: Mibew\Controller\CannedMessageController::showEditFormAction
|
||||||
|
_access_check: Mibew\AccessControl\Check\PermissionsCheck
|
||||||
|
_access_permissions: [CAN_ADMINISTRATE]
|
||||||
|
methods: [GET]
|
||||||
|
|
||||||
|
canned_message_add_save:
|
||||||
|
path: /operator/canned-message/add
|
||||||
|
defaults:
|
||||||
|
_controller: Mibew\Controller\CannedMessageController::submitEditFormAction
|
||||||
|
_access_check: Mibew\AccessControl\Check\PermissionsCheck
|
||||||
|
_access_permissions: [CAN_ADMINISTRATE]
|
||||||
|
methods: [POST]
|
||||||
|
|
||||||
|
canned_message_delete:
|
||||||
|
path: /operator/canned-message/{message_id}/delete
|
||||||
|
defaults:
|
||||||
|
_controller: Mibew\Controller\CannedMessageController::deleteAction
|
||||||
|
_access_check: Mibew\AccessControl\Check\PermissionsCheck
|
||||||
|
_access_permissions: [CAN_ADMINISTRATE]
|
||||||
|
requirements:
|
||||||
|
message_id: \d{1,10}
|
||||||
|
|
||||||
|
canned_message_edit:
|
||||||
|
path: /operator/canned-message/{message_id}/edit
|
||||||
|
defaults:
|
||||||
|
_controller: Mibew\Controller\CannedMessageController::showEditFormAction
|
||||||
|
_access_check: Mibew\AccessControl\Check\PermissionsCheck
|
||||||
|
_access_permissions: [CAN_ADMINISTRATE]
|
||||||
|
requirements:
|
||||||
|
message_id: \d{1,10}
|
||||||
|
methods: [GET]
|
||||||
|
|
||||||
|
canned_message_edit_save:
|
||||||
|
path: /operator/canned-message/{message_id}/edit
|
||||||
|
defaults:
|
||||||
|
_controller: Mibew\Controller\CannedMessageController::submitEditFormAction
|
||||||
|
_access_check: Mibew\AccessControl\Check\PermissionsCheck
|
||||||
|
_access_permissions: [CAN_ADMINISTRATE]
|
||||||
|
requirements:
|
||||||
|
message_id: \d{1,10}
|
||||||
|
methods: [POST]
|
||||||
|
|
||||||
|
canned_messages:
|
||||||
|
path: /operator/canned-message
|
||||||
|
defaults:
|
||||||
|
_controller: Mibew\Controller\CannedMessageController::indexAction
|
||||||
|
_access_check: Mibew\AccessControl\Check\PermissionsCheck
|
||||||
|
_access_permissions: [CAN_ADMINISTRATE]
|
||||||
|
|
||||||
|
## Groups
|
||||||
|
group_add:
|
||||||
|
path: /operator/group/add
|
||||||
|
defaults:
|
||||||
|
_controller: Mibew\Controller\Group\SettingsController::showFormAction
|
||||||
|
_access_check: Mibew\AccessControl\Check\PermissionsCheck
|
||||||
|
_access_permissions: [CAN_ADMINISTRATE]
|
||||||
|
methods: [GET]
|
||||||
|
|
||||||
|
group_add_save:
|
||||||
|
path: /operator/group/add
|
||||||
|
defaults:
|
||||||
|
_controller: Mibew\Controller\Group\SettingsController::submitFormAction
|
||||||
|
_access_check: Mibew\AccessControl\Check\PermissionsCheck
|
||||||
|
_access_permissions: [CAN_ADMINISTRATE]
|
||||||
|
methods: [POST]
|
||||||
|
|
||||||
|
group_delete:
|
||||||
|
path: /operator/group/{group_id}/delete
|
||||||
|
defaults:
|
||||||
|
_controller: Mibew\Controller\Group\ManagementController::deleteAction
|
||||||
|
_access_check: Mibew\AccessControl\Check\PermissionsCheck
|
||||||
|
_access_permissions: [CAN_ADMINISTRATE]
|
||||||
|
requirements:
|
||||||
|
group_id: \d{1,10}
|
||||||
|
|
||||||
|
group_edit:
|
||||||
|
path: /operator/group/{group_id}/edit
|
||||||
|
defaults:
|
||||||
|
_controller: Mibew\Controller\Group\SettingsController::showFormAction
|
||||||
|
_access_check: Mibew\AccessControl\Check\PermissionsCheck
|
||||||
|
_access_permissions: [CAN_ADMINISTRATE]
|
||||||
|
requirements:
|
||||||
|
group_id: \d{1,10}
|
||||||
|
methods: [GET]
|
||||||
|
|
||||||
|
group_edit_save:
|
||||||
|
path: /operator/group/{group_id}/edit
|
||||||
|
defaults:
|
||||||
|
_controller: Mibew\Controller\Group\SettingsController::submitFormAction
|
||||||
|
_access_check: Mibew\AccessControl\Check\PermissionsCheck
|
||||||
|
_access_permissions: [CAN_ADMINISTRATE]
|
||||||
|
requirements:
|
||||||
|
group_id: \d{1,10}
|
||||||
|
methods: [POST]
|
||||||
|
|
||||||
|
group_members:
|
||||||
|
path: /operator/group/{group_id}/members
|
||||||
|
defaults:
|
||||||
|
_controller: Mibew\Controller\Group\MembersController::showFormAction
|
||||||
|
_access_check: Mibew\AccessControl\Check\PermissionsCheck
|
||||||
|
_access_permissions: [CAN_ADMINISTRATE]
|
||||||
|
requirements:
|
||||||
|
group_id: \d{1,10}
|
||||||
|
methods: [GET]
|
||||||
|
|
||||||
|
group_members_save:
|
||||||
|
path: /operator/group/{group_id}/members
|
||||||
|
defaults:
|
||||||
|
_controller: Mibew\Controller\Group\MembersController::submitFormAction
|
||||||
|
_access_check: Mibew\AccessControl\Check\PermissionsCheck
|
||||||
|
_access_permissions: [CAN_ADMINISTRATE]
|
||||||
|
requirements:
|
||||||
|
group_id: \d{1,10}
|
||||||
|
methods: [POST]
|
||||||
|
|
||||||
|
groups:
|
||||||
|
path: /operator/group
|
||||||
|
defaults:
|
||||||
|
_controller: Mibew\Controller\Group\ManagementController::indexAction
|
||||||
|
_access_check: Mibew\AccessControl\Check\PermissionsCheck
|
||||||
|
_access_permissions: [CAN_ADMINISTRATE]
|
||||||
|
|
||||||
|
## History
|
||||||
|
history:
|
||||||
|
path: /operator/history
|
||||||
|
defaults:
|
||||||
|
_controller: Mibew\Controller\HistoryController::indexAction
|
||||||
|
_access_check: Mibew\AccessControl\Check\LoggedInCheck
|
||||||
|
|
||||||
|
history_thread:
|
||||||
|
path: /operator/history/thread/{thread_id}
|
||||||
|
defaults:
|
||||||
|
_controller: Mibew\Controller\HistoryController::threadAction
|
||||||
|
_access_check: Mibew\AccessControl\Check\LoggedInCheck
|
||||||
|
requirements:
|
||||||
|
thread_id: \d{1,10}
|
||||||
|
|
||||||
|
history_user:
|
||||||
|
path: /operator/history/user/{user_id}
|
||||||
|
defaults:
|
||||||
|
_controller: Mibew\Controller\HistoryController::userAction
|
||||||
|
_access_check: Mibew\AccessControl\Check\LoggedInCheck
|
||||||
|
requirements:
|
||||||
|
user_id: .{0,63}
|
||||||
|
|
||||||
|
history_user_track:
|
||||||
|
path: /operator/history/user-track
|
||||||
|
defaults:
|
||||||
|
_controller: Mibew\Controller\HistoryController::userTrackAction
|
||||||
|
_access_check: Mibew\AccessControl\Check\LoggedInCheck
|
||||||
|
|
||||||
|
## Home
|
||||||
|
home:
|
||||||
|
path: /
|
||||||
|
defaults:
|
||||||
|
_controller: Mibew\Controller\HomeController::redirectAction
|
||||||
|
|
||||||
|
home_operator:
|
||||||
|
path: /operator
|
||||||
|
defaults:
|
||||||
|
_controller: Mibew\Controller\HomeController::dashboardAction
|
||||||
|
_access_check: Mibew\AccessControl\Check\LoggedInCheck
|
||||||
|
|
||||||
|
## Invitations
|
||||||
|
invite:
|
||||||
|
path: /operator/invite
|
||||||
|
defaults:
|
||||||
|
_controller: Mibew\Controller\InvitationController::inviteAction
|
||||||
|
_access_check: Mibew\AccessControl\Check\LoggedInCheck
|
||||||
|
|
||||||
|
## Locales
|
||||||
|
locale_disable:
|
||||||
|
path: /operator/locale/{locale}/disable
|
||||||
|
defaults:
|
||||||
|
_controller: Mibew\Controller\Localization\LocaleController::disableAction
|
||||||
|
_access_check: Mibew\AccessControl\Check\PermissionsCheck
|
||||||
|
_access_permissions: [CAN_ADMINISTRATE]
|
||||||
|
requirements:
|
||||||
|
locale: "[a-z\\-]{2,5}"
|
||||||
|
|
||||||
|
locale_edit:
|
||||||
|
path: /operator/locale/{locale}/edit
|
||||||
|
defaults:
|
||||||
|
_controller: Mibew\Controller\Localization\LocaleController::showEditFormAction
|
||||||
|
_access_check: Mibew\AccessControl\Check\PermissionsCheck
|
||||||
|
_access_permissions: [CAN_ADMINISTRATE]
|
||||||
|
requirements:
|
||||||
|
locale: "[a-z\\-]{2,5}"
|
||||||
|
methods: [GET]
|
||||||
|
|
||||||
|
locale_edit_save:
|
||||||
|
path: /operator/locale/{locale}/edit
|
||||||
|
defaults:
|
||||||
|
_controller: Mibew\Controller\Localization\LocaleController::submitEditFormAction
|
||||||
|
_access_check: Mibew\AccessControl\Check\PermissionsCheck
|
||||||
|
_access_permissions: [CAN_ADMINISTRATE]
|
||||||
|
requirements:
|
||||||
|
locale: "[a-z\\-]{2,5}"
|
||||||
|
methods: [POST]
|
||||||
|
|
||||||
|
locale_enable:
|
||||||
|
path: /operator/locale/{locale}/enable
|
||||||
|
defaults:
|
||||||
|
_controller: Mibew\Controller\Localization\LocaleController::enableAction
|
||||||
|
_access_check: Mibew\AccessControl\Check\PermissionsCheck
|
||||||
|
_access_permissions: [CAN_ADMINISTRATE]
|
||||||
|
requirements:
|
||||||
|
locale: "[a-z\\-]{2,5}"
|
||||||
|
|
||||||
|
locales:
|
||||||
|
path: /operator/locale
|
||||||
|
defaults:
|
||||||
|
_controller: Mibew\Controller\Localization\LocaleController::indexAction
|
||||||
|
_access_check: Mibew\AccessControl\Check\PermissionsCheck
|
||||||
|
_access_permissions: [CAN_ADMINISTRATE]
|
||||||
|
|
||||||
|
## Log in
|
||||||
|
login:
|
||||||
|
path: /operator/login
|
||||||
|
defaults:
|
||||||
|
_controller: Mibew\Controller\LoginController::showFormAction
|
||||||
|
methods: [GET]
|
||||||
|
|
||||||
|
login_submit:
|
||||||
|
path: /operator/login
|
||||||
|
defaults:
|
||||||
|
_controller: Mibew\Controller\LoginController::submitFormAction
|
||||||
|
methods: [POST]
|
||||||
|
|
||||||
|
## Log out
|
||||||
|
logout:
|
||||||
|
path: /operator/logout
|
||||||
|
defaults:
|
||||||
|
_controller: Mibew\Controller\LogoutController::logoutAction
|
||||||
|
_access_check: Mibew\AccessControl\Check\LoggedInCheck
|
||||||
|
|
||||||
|
## Mail templates
|
||||||
|
mail_template_edit:
|
||||||
|
path: /operator/mail-template/{name}/edit
|
||||||
|
defaults:
|
||||||
|
_controller: Mibew\Controller\MailTemplateController::showEditFormAction
|
||||||
|
_access_check: Mibew\AccessControl\Check\PermissionsCheck
|
||||||
|
_access_permissions: [CAN_ADMINISTRATE]
|
||||||
|
methods: [GET]
|
||||||
|
requirements:
|
||||||
|
name: "[A-Za-z0-9_]+"
|
||||||
|
|
||||||
|
mail_template_edit_save:
|
||||||
|
path: /operator/mail-template/{name}/edit
|
||||||
|
defaults:
|
||||||
|
_controller: Mibew\Controller\MailTemplateController::submitEditFormAction
|
||||||
|
_access_check: Mibew\AccessControl\Check\PermissionsCheck
|
||||||
|
_access_permissions: [CAN_ADMINISTRATE]
|
||||||
|
methods: [POST]
|
||||||
|
requirements:
|
||||||
|
name: "[A-Za-z0-9_]+"
|
||||||
|
|
||||||
|
mail_templates:
|
||||||
|
path: /operator/mail-template
|
||||||
|
defaults:
|
||||||
|
_controller: Mibew\Controller\MailTemplateController::indexAction
|
||||||
|
_access_check: Mibew\AccessControl\Check\PermissionsCheck
|
||||||
|
_access_permissions: [CAN_ADMINISTRATE]
|
||||||
|
|
||||||
|
## Operators
|
||||||
|
operator_add:
|
||||||
|
path: /operator/operator/add
|
||||||
|
defaults:
|
||||||
|
_controller: Mibew\Controller\Operator\ProfileController::showFormAction
|
||||||
|
_access_check: Mibew\AccessControl\Check\PermissionsCheck
|
||||||
|
_access_permissions: [CAN_ADMINISTRATE]
|
||||||
|
methods: [GET]
|
||||||
|
|
||||||
|
operator_add_save:
|
||||||
|
path: /operator/operator/add
|
||||||
|
defaults:
|
||||||
|
_controller: Mibew\Controller\Operator\ProfileController::submitFormAction
|
||||||
|
_access_check: Mibew\AccessControl\Check\PermissionsCheck
|
||||||
|
_access_permissions: [CAN_ADMINISTRATE]
|
||||||
|
methods: [POST]
|
||||||
|
|
||||||
|
operator_avatar:
|
||||||
|
path: /operator/operator/{operator_id}/avatar
|
||||||
|
defaults:
|
||||||
|
_controller: Mibew\Controller\Operator\AvatarController::showFormAction
|
||||||
|
_access_check: Mibew\AccessControl\Check\OperatorViewCheck
|
||||||
|
requirements:
|
||||||
|
operator_id: \d{1,10}
|
||||||
|
methods: [GET]
|
||||||
|
|
||||||
|
operator_avatar_delete:
|
||||||
|
path: /operator/operator/{operator_id}/avatar/delete
|
||||||
|
defaults:
|
||||||
|
_controller: Mibew\Controller\Operator\AvatarController::deleteAction
|
||||||
|
_access_check: Mibew\AccessControl\Check\OperatorEditCheck
|
||||||
|
requirements:
|
||||||
|
operator_id: \d{1,10}
|
||||||
|
|
||||||
|
operator_avatar_save:
|
||||||
|
path: /operator/operator/{operator_id}/avatar
|
||||||
|
defaults:
|
||||||
|
_controller: Mibew\Controller\Operator\AvatarController::submitFormAction
|
||||||
|
_access_check: Mibew\AccessControl\Check\OperatorEditCheck
|
||||||
|
requirements:
|
||||||
|
operator_id: \d{1,10}
|
||||||
|
methods: [POST]
|
||||||
|
|
||||||
|
operator_edit:
|
||||||
|
path: /operator/operator/{operator_id}/edit
|
||||||
|
defaults:
|
||||||
|
_controller: Mibew\Controller\Operator\ProfileController::showFormAction
|
||||||
|
_access_check: Mibew\AccessControl\Check\OperatorViewCheck
|
||||||
|
requirements:
|
||||||
|
operator_id: \d{1,10}
|
||||||
|
methods: [GET]
|
||||||
|
|
||||||
|
operator_edit_save:
|
||||||
|
path: /operator/operator/{operator_id}/edit
|
||||||
|
defaults:
|
||||||
|
_controller: Mibew\Controller\Operator\ProfileController::submitFormAction
|
||||||
|
_access_check: Mibew\AccessControl\Check\OperatorEditCheck
|
||||||
|
requirements:
|
||||||
|
operator_id: \d{1,10}
|
||||||
|
methods: [POST]
|
||||||
|
|
||||||
|
operator_enable:
|
||||||
|
path: /operator/operator/{operator_id}/enable
|
||||||
|
defaults:
|
||||||
|
_controller: Mibew\Controller\Operator\ManagementController::enableAction
|
||||||
|
_access_check: Mibew\AccessControl\Check\PermissionsCheck
|
||||||
|
_access_permissions: [CAN_ADMINISTRATE]
|
||||||
|
requirements:
|
||||||
|
operator_id: \d{1,10}
|
||||||
|
|
||||||
|
operator_delete:
|
||||||
|
path: /operator/operator/{operator_id}/delete
|
||||||
|
defaults:
|
||||||
|
_controller: Mibew\Controller\Operator\ManagementController::deleteAction
|
||||||
|
_access_check: Mibew\AccessControl\Check\PermissionsCheck
|
||||||
|
_access_permissions: [CAN_ADMINISTRATE]
|
||||||
|
requirements:
|
||||||
|
operator_id: \d{1,10}
|
||||||
|
|
||||||
|
operator_disable:
|
||||||
|
path: /operator/operator/{operator_id}/disable
|
||||||
|
defaults:
|
||||||
|
_controller: Mibew\Controller\Operator\ManagementController::disableAction
|
||||||
|
_access_check: Mibew\AccessControl\Check\PermissionsCheck
|
||||||
|
_access_permissions: [CAN_ADMINISTRATE]
|
||||||
|
requirements:
|
||||||
|
operator_id: \d{1,10}
|
||||||
|
|
||||||
|
operator_groups:
|
||||||
|
path: /operator/operator/{operator_id}/groups
|
||||||
|
defaults:
|
||||||
|
_controller: Mibew\Controller\Operator\GroupsController::showFormAction
|
||||||
|
_access_check: Mibew\AccessControl\Check\OperatorViewCheck
|
||||||
|
requirements:
|
||||||
|
operator_id: \d{1,10}
|
||||||
|
methods: [GET]
|
||||||
|
|
||||||
|
operator_groups_save:
|
||||||
|
path: /operator/operator/{operator_id}/groups
|
||||||
|
defaults:
|
||||||
|
_controller: Mibew\Controller\Operator\GroupsController::submitFormAction
|
||||||
|
_access_check: Mibew\AccessControl\Check\PermissionsCheck
|
||||||
|
_access_permissions: [CAN_ADMINISTRATE]
|
||||||
|
requirements:
|
||||||
|
operator_id: \d{1,10}
|
||||||
|
methods: [POST]
|
||||||
|
|
||||||
|
operator_permissions:
|
||||||
|
path: /operator/operator/{operator_id}/permissions
|
||||||
|
defaults:
|
||||||
|
_controller: Mibew\Controller\Operator\PermissionsController::showFormAction
|
||||||
|
_access_check: Mibew\AccessControl\Check\OperatorViewCheck
|
||||||
|
requirements:
|
||||||
|
operator_id: \d{1,10}
|
||||||
|
methods: [GET]
|
||||||
|
|
||||||
|
operator_permissions_save:
|
||||||
|
path: /operator/operator/{operator_id}/permissions
|
||||||
|
defaults:
|
||||||
|
_controller: Mibew\Controller\Operator\PermissionsController::submitFormAction
|
||||||
|
_access_check: Mibew\AccessControl\Check\PermissionsCheck
|
||||||
|
_access_permissions: [CAN_ADMINISTRATE]
|
||||||
|
requirements:
|
||||||
|
operator_id: \d{1,10}
|
||||||
|
methods: [POST]
|
||||||
|
|
||||||
|
operators:
|
||||||
|
path: /operator/operator
|
||||||
|
defaults:
|
||||||
|
_controller: Mibew\Controller\Operator\ManagementController::indexAction
|
||||||
|
_access_check: Mibew\AccessControl\Check\PermissionsCheck
|
||||||
|
_access_permissions: [CAN_ADMINISTRATE]
|
||||||
|
|
||||||
|
## Password recovery
|
||||||
|
password_recovery:
|
||||||
|
path: /operator/password-recovery
|
||||||
|
defaults:
|
||||||
|
_controller: Mibew\Controller\PasswordRecoveryController::indexAction
|
||||||
|
|
||||||
|
password_recovery_reset:
|
||||||
|
path: /operator/password-recovery/reset
|
||||||
|
defaults:
|
||||||
|
_controller: Mibew\Controller\PasswordRecoveryController::resetAction
|
||||||
|
|
||||||
|
## Plugins
|
||||||
|
plugin_enable:
|
||||||
|
path: /operator/plugin/{plugin_name}/enable
|
||||||
|
defaults:
|
||||||
|
_controller: Mibew\Controller\PluginController::enableAction
|
||||||
|
_access_check: Mibew\AccessControl\Check\PermissionsCheck
|
||||||
|
_access_permissions: [CAN_ADMINISTRATE]
|
||||||
|
|
||||||
|
plugin_disable:
|
||||||
|
path: /operator/plugin/{plugin_name}/disable
|
||||||
|
defaults:
|
||||||
|
_controller: Mibew\Controller\PluginController::disableAction
|
||||||
|
_access_check: Mibew\AccessControl\Check\PermissionsCheck
|
||||||
|
_access_permissions: [CAN_ADMINISTRATE]
|
||||||
|
|
||||||
|
plugin_uninstall:
|
||||||
|
path: /operator/plugin/{plugin_name}/uninstall
|
||||||
|
defaults:
|
||||||
|
_controller: Mibew\Controller\PluginController::uninstallAction
|
||||||
|
_access_check: Mibew\AccessControl\Check\PermissionsCheck
|
||||||
|
_access_permissions: [CAN_ADMINISTRATE]
|
||||||
|
|
||||||
|
plugin_update:
|
||||||
|
path: /operator/plugin/{plugin_name}/update
|
||||||
|
defaults:
|
||||||
|
_controller: Mibew\Controller\PluginController::updateAction
|
||||||
|
_access_check: Mibew\AccessControl\Check\PermissionsCheck
|
||||||
|
_access_permissions: [CAN_ADMINISTRATE]
|
||||||
|
|
||||||
|
plugins:
|
||||||
|
path: /operator/plugin
|
||||||
|
defaults:
|
||||||
|
_controller: Mibew\Controller\PluginController::indexAction
|
||||||
|
_access_check: Mibew\AccessControl\Check\PermissionsCheck
|
||||||
|
_access_permissions: [CAN_ADMINISTRATE]
|
||||||
|
|
||||||
|
## Settings
|
||||||
|
settings_common:
|
||||||
|
path: /operator/settings
|
||||||
|
defaults:
|
||||||
|
_controller: Mibew\Controller\Settings\CommonController::showFormAction
|
||||||
|
_access_check: Mibew\AccessControl\Check\PermissionsCheck
|
||||||
|
_access_permissions: [CAN_ADMINISTRATE]
|
||||||
|
methods: [GET]
|
||||||
|
|
||||||
|
settings_common_save:
|
||||||
|
path: /operator/settings
|
||||||
|
defaults:
|
||||||
|
_controller: Mibew\Controller\Settings\CommonController::submitFormAction
|
||||||
|
_access_check: Mibew\AccessControl\Check\PermissionsCheck
|
||||||
|
_access_permissions: [CAN_ADMINISTRATE]
|
||||||
|
methods: [POST]
|
||||||
|
|
||||||
|
settings_features:
|
||||||
|
path: /operator/settings/features
|
||||||
|
defaults:
|
||||||
|
_controller: Mibew\Controller\Settings\FeaturesController::showFormAction
|
||||||
|
_access_check: Mibew\AccessControl\Check\PermissionsCheck
|
||||||
|
_access_permissions: [CAN_ADMINISTRATE]
|
||||||
|
methods: [GET]
|
||||||
|
|
||||||
|
settings_features_save:
|
||||||
|
path: /operator/settings/features
|
||||||
|
defaults:
|
||||||
|
_controller: Mibew\Controller\Settings\FeaturesController::submitFormAction
|
||||||
|
_access_check: Mibew\AccessControl\Check\PermissionsCheck
|
||||||
|
_access_permissions: [CAN_ADMINISTRATE]
|
||||||
|
methods: [POST]
|
||||||
|
|
||||||
|
settings_performance:
|
||||||
|
path: /operator/settings/performance
|
||||||
|
defaults:
|
||||||
|
_controller: Mibew\Controller\Settings\PerformanceController::showFormAction
|
||||||
|
_access_check: Mibew\AccessControl\Check\PermissionsCheck
|
||||||
|
_access_permissions: [CAN_ADMINISTRATE]
|
||||||
|
methods: [GET]
|
||||||
|
|
||||||
|
settings_performance_save:
|
||||||
|
path: /operator/settings/performance
|
||||||
|
defaults:
|
||||||
|
_controller: Mibew\Controller\Settings\PerformanceController::submitFormAction
|
||||||
|
_access_check: Mibew\AccessControl\Check\PermissionsCheck
|
||||||
|
_access_permissions: [CAN_ADMINISTRATE]
|
||||||
|
methods: [POST]
|
||||||
|
|
||||||
|
## Statistics
|
||||||
|
statistics:
|
||||||
|
path: /operator/statistics/{type}
|
||||||
|
defaults:
|
||||||
|
type: "by-date"
|
||||||
|
_controller: Mibew\Controller\StatisticsController::indexAction
|
||||||
|
_access_check: Mibew\AccessControl\Check\PermissionsCheck
|
||||||
|
_access_permissions: [CAN_VIEWSTATISTICS]
|
||||||
|
requirements:
|
||||||
|
type: by-date|by-operator|by-page
|
||||||
|
|
||||||
|
## Styles
|
||||||
|
style_preview:
|
||||||
|
path: /operator/style/{type}/preview
|
||||||
|
defaults:
|
||||||
|
_controller: Mibew\Controller\StyleController::previewAction
|
||||||
|
_access_check: Mibew\AccessControl\Check\PermissionsCheck
|
||||||
|
_access_permissions: [CAN_ADMINISTRATE]
|
||||||
|
requirements:
|
||||||
|
type: chat|invitation|page
|
||||||
|
|
||||||
|
## Translation
|
||||||
|
translation_edit:
|
||||||
|
path: /operator/translation/{string_id}/edit
|
||||||
|
defaults:
|
||||||
|
_controller: Mibew\Controller\Localization\TranslationController::showEditFormAction
|
||||||
|
_access_check: Mibew\AccessControl\Check\PermissionsCheck
|
||||||
|
_access_permissions: [CAN_ADMINISTRATE]
|
||||||
|
requirements:
|
||||||
|
string_id: "\\d{1,10}"
|
||||||
|
methods: [GET]
|
||||||
|
|
||||||
|
translation_edit_save:
|
||||||
|
path: /operator/translation/{string_id}/edit
|
||||||
|
defaults:
|
||||||
|
_controller: Mibew\Controller\Localization\TranslationController::submitEditFormAction
|
||||||
|
_access_check: Mibew\AccessControl\Check\PermissionsCheck
|
||||||
|
_access_permissions: [CAN_ADMINISTRATE]
|
||||||
|
requirements:
|
||||||
|
string_id: "\\d{1,10}"
|
||||||
|
methods: [POST]
|
||||||
|
|
||||||
|
translation_export:
|
||||||
|
path: /operator/translation/export
|
||||||
|
defaults:
|
||||||
|
_controller: Mibew\Controller\Localization\TranslationExportController::showFormAction
|
||||||
|
_access_check: Mibew\AccessControl\Check\PermissionsCheck
|
||||||
|
_access_permissions: [CAN_ADMINISTRATE]
|
||||||
|
methods: [GET]
|
||||||
|
|
||||||
|
translation_export_process:
|
||||||
|
path: /operator/translation/export
|
||||||
|
defaults:
|
||||||
|
_controller: Mibew\Controller\Localization\TranslationExportController::submitFormAction
|
||||||
|
_access_check: Mibew\AccessControl\Check\PermissionsCheck
|
||||||
|
_access_permissions: [CAN_ADMINISTRATE]
|
||||||
|
methods: [POST]
|
||||||
|
|
||||||
|
translation_import:
|
||||||
|
path: /operator/translation/import
|
||||||
|
defaults:
|
||||||
|
_controller: Mibew\Controller\Localization\TranslationImportController::showFormAction
|
||||||
|
_access_check: Mibew\AccessControl\Check\PermissionsCheck
|
||||||
|
_access_permissions: [CAN_ADMINISTRATE]
|
||||||
|
methods: [GET]
|
||||||
|
|
||||||
|
translation_import_process:
|
||||||
|
path: /operator/translation/import
|
||||||
|
defaults:
|
||||||
|
_controller: Mibew\Controller\Localization\TranslationImportController::submitFormAction
|
||||||
|
_access_check: Mibew\AccessControl\Check\PermissionsCheck
|
||||||
|
_access_permissions: [CAN_ADMINISTRATE]
|
||||||
|
methods: [POST]
|
||||||
|
|
||||||
|
translations:
|
||||||
|
path: /operator/translation
|
||||||
|
defaults:
|
||||||
|
_controller: Mibew\Controller\Localization\TranslationController::indexAction
|
||||||
|
_access_check: Mibew\AccessControl\Check\PermissionsCheck
|
||||||
|
_access_permissions: [CAN_ADMINISTRATE]
|
||||||
|
|
||||||
|
## Updates
|
||||||
|
update:
|
||||||
|
path: /update
|
||||||
|
defaults:
|
||||||
|
_controller: Mibew\Controller\UpdateController::indexAction
|
||||||
|
_access_check: Mibew\AccessControl\Check\PermissionsCheck
|
||||||
|
_access_permissions: [CAN_ADMINISTRATE]
|
||||||
|
|
||||||
|
update_run:
|
||||||
|
path: /update/run
|
||||||
|
defaults:
|
||||||
|
_controller: Mibew\Controller\UpdateController::runUpdateAction
|
||||||
|
_access_check: Mibew\AccessControl\Check\PermissionsCheck
|
||||||
|
_access_permissions: [CAN_ADMINISTRATE]
|
||||||
|
|
||||||
|
update_check:
|
||||||
|
path: /update/check
|
||||||
|
defaults:
|
||||||
|
_controller: Mibew\Controller\UpdateController::checkUpdatesAction
|
||||||
|
_access_check: Mibew\AccessControl\Check\PermissionsCheck
|
||||||
|
_access_permissions: [CAN_ADMINISTRATE]
|
||||||
|
|
||||||
|
## Users (visitors avaiting page)
|
||||||
|
users:
|
||||||
|
path: /operator/users
|
||||||
|
defaults:
|
||||||
|
_controller: Mibew\Controller\UsersController::indexAction
|
||||||
|
_access_check: Mibew\AccessControl\Check\LoggedInCheck
|
||||||
|
|
||||||
|
users_update:
|
||||||
|
path: /operator/users/update
|
||||||
|
defaults:
|
||||||
|
_controller: Mibew\Controller\UsersController::updateAction
|
||||||
|
_access_check: Mibew\AccessControl\Check\LoggedInCheck
|
||||||
|
|
||||||
|
# System routes and includes
|
||||||
|
|
||||||
|
# The following route is a fake and is used only to load plugins routes. It can
|
||||||
|
# have any unique name.
|
||||||
|
_include_pluign_routes:
|
||||||
|
# Resource name has no meaning and can be any value.
|
||||||
|
resource: .
|
||||||
|
# The type actually indicates that plugins routes should be included.
|
||||||
|
type: plugin
|
||||||
|
|
||||||
|
# Remove trailing slashes. This route is the last one because previous rotes can
|
||||||
|
# (but definitely should not) have trailing slashes.
|
||||||
|
remove_trailing_slash:
|
||||||
|
path: /{url}
|
||||||
|
defaults:
|
||||||
|
_controller: Mibew\Controller\RedirectController::removeTrailingSlashAction
|
||||||
|
requirements:
|
||||||
|
url: .*/$
|
||||||
|
methods: [GET]
|
60
src/mibew/configs/routing_install.yml
Normal file
@ -0,0 +1,60 @@
|
|||||||
|
# The following route is a fake and is used only to load routes of the core. It
|
||||||
|
# can have any unique name.
|
||||||
|
_include_core_routes:
|
||||||
|
resource: routing.yml
|
||||||
|
type: yaml
|
||||||
|
|
||||||
|
# Override the home route to allow users use <mibew root>/install.php path to
|
||||||
|
# the installer.
|
||||||
|
home:
|
||||||
|
path: /
|
||||||
|
defaults:
|
||||||
|
_controller: Mibew\Controller\InstallController::indexAction
|
||||||
|
|
||||||
|
install:
|
||||||
|
path: /install
|
||||||
|
defaults:
|
||||||
|
_controller: Mibew\Controller\InstallController::indexAction
|
||||||
|
|
||||||
|
install_check_requirements:
|
||||||
|
path: /install/check-requirements
|
||||||
|
defaults:
|
||||||
|
_controller: Mibew\Controller\InstallController::checkRequirementsAction
|
||||||
|
_access_check: Mibew\AccessControl\Check\CanInstallCheck
|
||||||
|
|
||||||
|
install_check_connection:
|
||||||
|
path: /install/check-connection
|
||||||
|
defaults:
|
||||||
|
_controller: Mibew\Controller\InstallController::checkConnectionAction
|
||||||
|
_access_check: Mibew\AccessControl\Check\CanInstallCheck
|
||||||
|
|
||||||
|
install_create_tables:
|
||||||
|
path: /install/create-tables
|
||||||
|
defaults:
|
||||||
|
_controller: Mibew\Controller\InstallController::createTablesAction
|
||||||
|
_access_check: Mibew\AccessControl\Check\CanInstallCheck
|
||||||
|
|
||||||
|
install_set_password:
|
||||||
|
path: /install/set-password
|
||||||
|
defaults:
|
||||||
|
_controller: Mibew\Controller\InstallController::showPasswordFormAction
|
||||||
|
_access_check: Mibew\AccessControl\Check\CanInstallCheck
|
||||||
|
methods: [GET]
|
||||||
|
|
||||||
|
install_set_password_submit:
|
||||||
|
path: /install/set-password
|
||||||
|
defaults:
|
||||||
|
_controller: Mibew\Controller\InstallController::submitPasswordFormAction
|
||||||
|
_access_check: Mibew\AccessControl\Check\CanInstallCheck
|
||||||
|
methods: [POST]
|
||||||
|
|
||||||
|
install_import_locales:
|
||||||
|
path: /install/import-locales
|
||||||
|
defaults:
|
||||||
|
_controller: Mibew\Controller\InstallController::importLocalesAction
|
||||||
|
_access_check: Mibew\AccessControl\Check\CanInstallCheck
|
||||||
|
|
||||||
|
install_done:
|
||||||
|
path: /install/done
|
||||||
|
defaults:
|
||||||
|
_controller: Mibew\Controller\InstallController::doneAction
|
52
src/mibew/cron.php
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
<?php
|
||||||
|
/*
|
||||||
|
* This file is a part of Mibew Messenger.
|
||||||
|
*
|
||||||
|
* Copyright 2005-2023 the original author or authors.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Initialize libraries
|
||||||
|
require_once(dirname(__FILE__) . '/libs/init.php');
|
||||||
|
|
||||||
|
use Mibew\Cache\CacheFactory;
|
||||||
|
use Mibew\Maintenance\CronWorker;
|
||||||
|
use Mibew\Plugin\PluginManager;
|
||||||
|
|
||||||
|
$configs = load_system_configs();
|
||||||
|
|
||||||
|
// Prepare the cache. It is initialized in the same way as in index.php
|
||||||
|
$cache_factory = new CacheFactory($configs['cache']);
|
||||||
|
// For now directory for cache files cannot be changed via the configs file.
|
||||||
|
$cache_factory->setOption('path', MIBEW_FS_ROOT . '/cache/stash');
|
||||||
|
|
||||||
|
// Run plugins
|
||||||
|
if (get_maintenance_mode() === false) {
|
||||||
|
$plugin_manager = PluginManager::getInstance();
|
||||||
|
$plugin_manager->setCache($cache_factory->getCache());
|
||||||
|
$plugin_manager->loadPlugins($configs['plugins']);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Do the job.
|
||||||
|
$worker = new CronWorker($cache_factory->getCache());
|
||||||
|
$success = $worker->run();
|
||||||
|
|
||||||
|
if ($success) {
|
||||||
|
echo("All cron jobs done\n");
|
||||||
|
} else {
|
||||||
|
echo("Cron job failed. Here are the errors:\n");
|
||||||
|
foreach ($worker->getErrors() as $error) {
|
||||||
|
echo(' ' . $error . "\n");
|
||||||
|
}
|
||||||
|
}
|
@ -1,921 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2005-2014 the original author or authors.
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* reset all */
|
|
||||||
|
|
||||||
html, body, div, h1, h2, h3, h4, h5, h6, ul, ol, dl, li, dt, dd, p, blockquote, pre, form, fieldset, table, th, td { margin: 0; padding: 0; }
|
|
||||||
table { border-collapse:collapse; border-spacing:0; }
|
|
||||||
fieldset,img { border:0; }
|
|
||||||
ol,ul { list-style:none; }
|
|
||||||
h1,h2,h3,h4,h5,h6 { font-size:100%; font-weight:normal; }
|
|
||||||
q:before,q:after { content:''; }
|
|
||||||
|
|
||||||
body {
|
|
||||||
background: #FFFFFF url(images/header.gif) repeat-x;
|
|
||||||
font-family: "Trebuchet MS", Arial, Helvetica, sans-serif;
|
|
||||||
font-size: 0.8em;
|
|
||||||
line-height: 140%;
|
|
||||||
color: #333333;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* 100% height with footer, 200 px sidebar */
|
|
||||||
|
|
||||||
html, body {
|
|
||||||
height: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
body {
|
|
||||||
min-width: 750px;
|
|
||||||
}
|
|
||||||
|
|
||||||
a {
|
|
||||||
color: #2f7599;
|
|
||||||
}
|
|
||||||
|
|
||||||
#wrap400, #wrap700, #fixedwrap {
|
|
||||||
position:relative;
|
|
||||||
margin: 0px auto -41px;
|
|
||||||
height:auto !important;
|
|
||||||
height:100%;
|
|
||||||
min-height:100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
#wrap400 {
|
|
||||||
width: 100%;
|
|
||||||
min-width:450px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#wrap700 {
|
|
||||||
width: 100%;
|
|
||||||
min-width:750px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#fixedwrap {
|
|
||||||
width: 750px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.contentdiv {
|
|
||||||
float:left;
|
|
||||||
width: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
.contentinner {
|
|
||||||
margin-right: 210px;
|
|
||||||
padding: 10px 60px 10px 20px;
|
|
||||||
overflow: hidden;
|
|
||||||
}
|
|
||||||
|
|
||||||
.contentnomenu {
|
|
||||||
padding: 10px 60px 10px 20px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.empty_inner {
|
|
||||||
height:40px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#footer {
|
|
||||||
background: white url(images/footer.gif) bottom repeat-x;
|
|
||||||
font-size:11px;
|
|
||||||
position:relative;
|
|
||||||
|
|
||||||
min-height: 40px;
|
|
||||||
height:40px;
|
|
||||||
vertical-align:middle;
|
|
||||||
|
|
||||||
width:100%;
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
|
|
||||||
#legal {
|
|
||||||
clear: both;
|
|
||||||
line-height: 30px;
|
|
||||||
padding-top:10px;
|
|
||||||
text-align: center;
|
|
||||||
color: #375C69;
|
|
||||||
margin-bottom: 0px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#footer .flink {
|
|
||||||
color: #2f7599;
|
|
||||||
text-decoration: underline;
|
|
||||||
}
|
|
||||||
|
|
||||||
#togglediv {
|
|
||||||
float:right;
|
|
||||||
padding-right:10px;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Header */
|
|
||||||
|
|
||||||
#header {
|
|
||||||
width: 100%;
|
|
||||||
height: 32px;
|
|
||||||
margin: 0px -2px 10px 0px;
|
|
||||||
padding-top: 10px;
|
|
||||||
padding-bottom: 10px;
|
|
||||||
background: url(images/graydot.gif) repeat-x left bottom;
|
|
||||||
display: block;
|
|
||||||
}
|
|
||||||
|
|
||||||
#header {
|
|
||||||
float: left;
|
|
||||||
}
|
|
||||||
|
|
||||||
img.left {
|
|
||||||
float: left;
|
|
||||||
margin-right: 15px;
|
|
||||||
}
|
|
||||||
|
|
||||||
img.logo {
|
|
||||||
margin-top: 2px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#header h1 {
|
|
||||||
font-size: 2em;
|
|
||||||
line-height: 32px;
|
|
||||||
color: #494949;
|
|
||||||
margin-left: 40px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#header h1 a {
|
|
||||||
color: #494949;
|
|
||||||
}
|
|
||||||
|
|
||||||
#header a {
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
#title {
|
|
||||||
float: left;
|
|
||||||
display: inline;
|
|
||||||
}
|
|
||||||
|
|
||||||
#path {
|
|
||||||
float: right;
|
|
||||||
padding: 10px 20px 0px 0px;
|
|
||||||
line-height: 22px;
|
|
||||||
display: inline;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Sidebar */
|
|
||||||
|
|
||||||
#sidebar {
|
|
||||||
float: left;
|
|
||||||
width: 185px;
|
|
||||||
margin-left: -210px;
|
|
||||||
margin-top: 20px;
|
|
||||||
position:relative;
|
|
||||||
line-height: 180%
|
|
||||||
}
|
|
||||||
|
|
||||||
#sidebar ul {
|
|
||||||
margin: 0;
|
|
||||||
padding: 0;
|
|
||||||
list-style: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
#sidebar li {
|
|
||||||
margin-bottom: 20px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#sidebar li ul {
|
|
||||||
}
|
|
||||||
|
|
||||||
#sidebar li li {
|
|
||||||
margin: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#sidebar h2 {
|
|
||||||
text-transform: lowercase;
|
|
||||||
margin-bottom: 10px;
|
|
||||||
background: url(images/graydot.gif) repeat-x left bottom;
|
|
||||||
font-size: 1.3em;
|
|
||||||
font-weight: bold;
|
|
||||||
}
|
|
||||||
|
|
||||||
.locales a {
|
|
||||||
color: #2f7599;
|
|
||||||
font-size: 1em;
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
.locales .active a {
|
|
||||||
color: #555;
|
|
||||||
}
|
|
||||||
|
|
||||||
.locales a:hover {
|
|
||||||
text-decoration: underline;
|
|
||||||
}
|
|
||||||
|
|
||||||
.submenu a {
|
|
||||||
padding-left: 15px;
|
|
||||||
color: #2f7599;
|
|
||||||
font-size: 1em;
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
.submenu a.inner { padding-left: 0px; }
|
|
||||||
.submenu span.small { font-size: 80%; padding-left: 5px; }
|
|
||||||
|
|
||||||
.submenu .active a {
|
|
||||||
background: url(images/li.gif) no-repeat left 1px;
|
|
||||||
color: #555;
|
|
||||||
}
|
|
||||||
|
|
||||||
.submenu .active a.inner {
|
|
||||||
background: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
.submenu a:hover {
|
|
||||||
text-decoration: underline;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* form, tabbed form */
|
|
||||||
|
|
||||||
.mform {
|
|
||||||
background: url(images/loginbg.gif);
|
|
||||||
clear: both;
|
|
||||||
width: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
.tabs {
|
|
||||||
float: right;
|
|
||||||
margin-left: 15px;
|
|
||||||
display: inline;
|
|
||||||
margin-right: 15px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.tabs li {
|
|
||||||
display: inline;
|
|
||||||
}
|
|
||||||
|
|
||||||
.tabs a {
|
|
||||||
display: block;
|
|
||||||
float: left;
|
|
||||||
padding: 2px 9px 3px 9px;
|
|
||||||
font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;
|
|
||||||
font-size: 11px;
|
|
||||||
color: #2f7599;
|
|
||||||
}
|
|
||||||
|
|
||||||
.tabs li.active a {
|
|
||||||
background: url(images/loginbg.gif);
|
|
||||||
border-left:1px solid #bbbbbb;border-top:1px solid #bbbbbb;border-right:1px solid #bbbbbb;
|
|
||||||
color: #000;
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
.formtop, .formbottom, .formtopi, .formbottomi { height: 15px;}
|
|
||||||
.formtop { background: url(images/logincrnrt.gif) no-repeat top right;}
|
|
||||||
.formtopi { background: url(images/logincrnlt.gif) no-repeat top left; }
|
|
||||||
.formbottom { background: url(images/logincrnrb.gif) no-repeat bottom right; }
|
|
||||||
.formbottomi { background: url(images/logincrnlb.gif) no-repeat bottom left; }
|
|
||||||
.forminner { margin: 0px 15px;}
|
|
||||||
.forminner p { margin-bottom: 1em; }
|
|
||||||
|
|
||||||
/* fieldForm */
|
|
||||||
|
|
||||||
.fieldForm {
|
|
||||||
font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;
|
|
||||||
font-size: 11px;
|
|
||||||
width: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
.packedFormField {
|
|
||||||
font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;
|
|
||||||
font-size: 11px;
|
|
||||||
float:left;
|
|
||||||
margin-right:25px;
|
|
||||||
margin-bottom:8px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.packedFormField select {
|
|
||||||
min-width: 130px;
|
|
||||||
}
|
|
||||||
|
|
||||||
div.errinfo {
|
|
||||||
color: #c13030;
|
|
||||||
}
|
|
||||||
|
|
||||||
.field {
|
|
||||||
width: 100%;
|
|
||||||
margin-top: 5px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.flabel {
|
|
||||||
position: relative;
|
|
||||||
margin: 8px auto 2px;
|
|
||||||
color: black;
|
|
||||||
}
|
|
||||||
|
|
||||||
.fleftlabel {
|
|
||||||
float: left;
|
|
||||||
width: 11em;
|
|
||||||
}
|
|
||||||
|
|
||||||
.flabel span.required {
|
|
||||||
font-size:8.0pt;
|
|
||||||
color:red;
|
|
||||||
font-weight: bold;
|
|
||||||
}
|
|
||||||
|
|
||||||
.field .subfield {
|
|
||||||
padding-left: 30px;
|
|
||||||
background: url(images/subitem.gif) no-repeat 10px 2px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.fieldinrow {
|
|
||||||
min-width: 300px;
|
|
||||||
display: inline;
|
|
||||||
float:left;
|
|
||||||
width: 45%;
|
|
||||||
}
|
|
||||||
|
|
||||||
.fvalue {
|
|
||||||
float: left;
|
|
||||||
}
|
|
||||||
|
|
||||||
.fvaluewithta {
|
|
||||||
float: left;
|
|
||||||
width: 67%;
|
|
||||||
}
|
|
||||||
|
|
||||||
.fvaluewithta textarea {
|
|
||||||
width: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
.fvaluenodesc {
|
|
||||||
}
|
|
||||||
|
|
||||||
.fvalueframe {
|
|
||||||
overflow: auto;
|
|
||||||
width: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
.fvalueframe iframe {
|
|
||||||
border: solid 1px #999;
|
|
||||||
}
|
|
||||||
|
|
||||||
.fdescr {
|
|
||||||
float:left;
|
|
||||||
padding-left:10px;
|
|
||||||
color: #676767;
|
|
||||||
font-size: 10px;
|
|
||||||
min-width: 200px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.fbutton {
|
|
||||||
background: url(images/formline.gif) repeat-x;
|
|
||||||
margin-top: 20px;
|
|
||||||
padding-top: 10px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.fbutton .links {
|
|
||||||
float: right;
|
|
||||||
margin-top: 5px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.fbutton .submitbutton {
|
|
||||||
float: left;
|
|
||||||
}
|
|
||||||
|
|
||||||
.formauth {
|
|
||||||
}
|
|
||||||
|
|
||||||
textarea.wide {
|
|
||||||
border:1px solid #878787;
|
|
||||||
overflow:auto;
|
|
||||||
width: 95%;
|
|
||||||
}
|
|
||||||
|
|
||||||
input.formauth {
|
|
||||||
border: 1px solid #878787;
|
|
||||||
color: #333;
|
|
||||||
margin-right:15px;
|
|
||||||
padding-right: 0px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#formmessage {
|
|
||||||
border: 1px solid #4C96D4;
|
|
||||||
background-color: #E7F1F9;
|
|
||||||
padding: 8px 11px;
|
|
||||||
font-size: 0.85em;
|
|
||||||
font-weight:bold;
|
|
||||||
max-width: 700px;
|
|
||||||
margin: -10px 2px 10px;
|
|
||||||
color: #515151;
|
|
||||||
}
|
|
||||||
|
|
||||||
#offwarn {
|
|
||||||
border: 1px solid #4CD496;
|
|
||||||
background-color: #E7F9F1;
|
|
||||||
color: #515151;
|
|
||||||
padding: 8px 11px;
|
|
||||||
font-size: 0.85em;
|
|
||||||
font-weight:bold;
|
|
||||||
line-height: 140%;
|
|
||||||
margin: 0px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#offwarn img {
|
|
||||||
margin-top: .4em;
|
|
||||||
float: left;
|
|
||||||
padding-right: 10px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.asterisk {
|
|
||||||
padding: 10px 20px;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* tables */
|
|
||||||
|
|
||||||
.tabletool {
|
|
||||||
float: right;
|
|
||||||
}
|
|
||||||
|
|
||||||
.tabletool a {
|
|
||||||
color: #296685;
|
|
||||||
vertical-align: top;
|
|
||||||
padding-left: 4px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.tabletitle {
|
|
||||||
background: url(images/graydot.gif) repeat-x left bottom;
|
|
||||||
font-family: "Lucida Sans Unicode", "Lucida Grande", Sans-Serif;
|
|
||||||
font-size: 1.4em;
|
|
||||||
margin: 10px 0px 20px;
|
|
||||||
padding-bottom: 10px;
|
|
||||||
color: #1D485E;
|
|
||||||
font-weight: bold;
|
|
||||||
}
|
|
||||||
|
|
||||||
table.list, table.translate, table.statistics {
|
|
||||||
font-family: "Lucida Sans Unicode", "Lucida Grande", Sans-Serif;
|
|
||||||
background: #fff;
|
|
||||||
width: 100%;
|
|
||||||
border-collapse: collapse;
|
|
||||||
text-align: left;
|
|
||||||
}
|
|
||||||
|
|
||||||
table.list th, table.translate th, table.statistics th {
|
|
||||||
font-size: 1.2em;
|
|
||||||
font-weight: normal;
|
|
||||||
padding: 10px 8px;
|
|
||||||
border-bottom: 2px solid #2F7598;
|
|
||||||
}
|
|
||||||
|
|
||||||
table.list th, table.translate th { color: #1D485E; }
|
|
||||||
table.statistics th { color: #2F7598; }
|
|
||||||
|
|
||||||
table.list td, table.statistics td {
|
|
||||||
color: #2f7599;
|
|
||||||
padding: 10px 8px;
|
|
||||||
border-bottom: 1px solid #ccc;
|
|
||||||
}
|
|
||||||
|
|
||||||
table.translate td {
|
|
||||||
font-family: Arial, Helvetica, sans-serif;
|
|
||||||
font-size: 12px;
|
|
||||||
color: #515151;
|
|
||||||
padding: 2px 8px;
|
|
||||||
border-bottom: 1px solid #ccc;
|
|
||||||
}
|
|
||||||
|
|
||||||
table.list td a.man {
|
|
||||||
background: url(images/tbliclogin.gif) no-repeat left center;
|
|
||||||
padding-left: 15px;
|
|
||||||
}
|
|
||||||
|
|
||||||
table.list td a.mail {
|
|
||||||
background: url(images/mail.png) no-repeat left center;
|
|
||||||
padding-left: 24px;
|
|
||||||
}
|
|
||||||
|
|
||||||
table.list td a.xmpp {
|
|
||||||
background: url(images/xmpp.png) no-repeat left center;
|
|
||||||
padding-left: 24px;
|
|
||||||
}
|
|
||||||
|
|
||||||
table.list tbody tr:hover td, table.list tbody tr:hover td a, table.statistics tbody tr:hover td {
|
|
||||||
color: #1D485E;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* awaiting */
|
|
||||||
|
|
||||||
table.awaiting {
|
|
||||||
font-family: "Lucida Sans Unicode", "Lucida Grande", Sans-Serif;
|
|
||||||
background: #fff;
|
|
||||||
width: 100%;
|
|
||||||
border-collapse: collapse;
|
|
||||||
text-align: left;
|
|
||||||
}
|
|
||||||
|
|
||||||
table.awaiting th {
|
|
||||||
font-size: 1.2em;
|
|
||||||
font-weight: normal;
|
|
||||||
color: #1D485E;
|
|
||||||
padding: 10px 8px;
|
|
||||||
border-bottom: 2px solid #2F7598;
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
|
|
||||||
table.awaiting th.first {
|
|
||||||
text-align: left;
|
|
||||||
}
|
|
||||||
|
|
||||||
table.awaiting table.inner {
|
|
||||||
border: none;
|
|
||||||
width: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
table.awaiting table.inner .icon {
|
|
||||||
width: 30px;
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
|
|
||||||
table.awaiting td.visitor {
|
|
||||||
color: #296685;
|
|
||||||
border-bottom: 1px solid #ccc;
|
|
||||||
padding: 10px 8px;
|
|
||||||
margin: 0px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.awaiting .visitor a { color: #296685; }
|
|
||||||
.awaiting tr:hover .visitor, .awaiting tr:hover .visitor a { color: #1D485E; }
|
|
||||||
|
|
||||||
.awaiting tr.ban .visitor, .awaiting tr.ban .visitor a { color: #9AC8E0; }
|
|
||||||
.awaiting tr.ban:hover .visitor, .awaiting tr.ban:hover .visitor a { color: #4C9CC8; }
|
|
||||||
|
|
||||||
.awaiting tr.inwait .visitor, .awaiting tr.inwait a { font-weight: bold; }
|
|
||||||
.awaiting tr.inprio .visitor, .awaiting tr.inprio a { font-weight: bold; font-size: 1.05em; }
|
|
||||||
.awaiting tr.inchat .visitor, .awaiting tr.inchat .visitor a { color: #777; }
|
|
||||||
.awaiting tr.inchat:hover .visitor, .awaiting tr.inchat:hover .visitor a { color: #444; }
|
|
||||||
.awaiting tr.inchat a { text-decoration: none; }
|
|
||||||
|
|
||||||
.firstmessage {
|
|
||||||
text-align: right;
|
|
||||||
font-size: 0.8em;
|
|
||||||
padding-right: 10px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.firstmessage a {
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
.firstmessage a:hover {
|
|
||||||
text-decoration: underline;
|
|
||||||
}
|
|
||||||
|
|
||||||
#connstatus {
|
|
||||||
float:right;
|
|
||||||
margin: 10px 10px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#connlinks {
|
|
||||||
margin: 10px 10px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#connlinks a {
|
|
||||||
color: #777;
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
#connlinks a:hover {
|
|
||||||
text-decoration: underline;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* online operators */
|
|
||||||
|
|
||||||
#onlineoperators {
|
|
||||||
padding-right: 10px;
|
|
||||||
float: right;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* search */
|
|
||||||
|
|
||||||
#searchtext {
|
|
||||||
float:left;
|
|
||||||
display: inline;
|
|
||||||
margin:7px 20px 5px 0px;
|
|
||||||
width:75%;
|
|
||||||
padding-right:5px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.searchctrl {
|
|
||||||
float: left;
|
|
||||||
margin:7px 20px 5px 0px;
|
|
||||||
padding-right:5px;
|
|
||||||
display: inline;
|
|
||||||
}
|
|
||||||
|
|
||||||
#searchtext input {
|
|
||||||
width: 100%;
|
|
||||||
margin: 0px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#searchbutton {
|
|
||||||
float:left;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* login */
|
|
||||||
|
|
||||||
#loginsmallpane {
|
|
||||||
float: right;
|
|
||||||
padding: 10px 15px 0px 0px;
|
|
||||||
margin-right: 0px;
|
|
||||||
line-height: 22px;
|
|
||||||
display: inline;
|
|
||||||
}
|
|
||||||
|
|
||||||
#loginsmallpane input {
|
|
||||||
margin: 0px 3px;
|
|
||||||
padding: 0px 2px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#loginsmallpane .butt {
|
|
||||||
height: 1.3em;
|
|
||||||
border: 0px;
|
|
||||||
background: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
#loginsmallpane .butt:hover {
|
|
||||||
background: #aaa;
|
|
||||||
}
|
|
||||||
|
|
||||||
#loginintro {
|
|
||||||
width: 400px;
|
|
||||||
margin: 10px 30px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#loginpane {
|
|
||||||
width: 400px;
|
|
||||||
margin: 30px 30px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#loginpane .header h2 {
|
|
||||||
font-size: 2em;
|
|
||||||
margin-bottom: 0.9em;
|
|
||||||
padding-bottom: 0.8em;
|
|
||||||
border-bottom: 2px solid #2F7598;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* nice button */
|
|
||||||
|
|
||||||
#confirmpane {
|
|
||||||
width:450px;
|
|
||||||
margin:0px auto 5px;
|
|
||||||
padding-top: 70px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.nicebutton {
|
|
||||||
border: none;
|
|
||||||
float: left;
|
|
||||||
margin-left: 30px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.submit a {
|
|
||||||
font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;
|
|
||||||
font-size: 11px;
|
|
||||||
line-height: 35px;
|
|
||||||
color: #000000;
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
.submit {
|
|
||||||
background: url(images/submitbg.gif) repeat-x;
|
|
||||||
vertical-align: top;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* thread log */
|
|
||||||
|
|
||||||
.logpane {
|
|
||||||
margin: 10px 0px;
|
|
||||||
line-height: 150%;
|
|
||||||
}
|
|
||||||
|
|
||||||
.logpane .header {
|
|
||||||
padding-bottom: 0.8em;
|
|
||||||
border-bottom: 2px solid #2F7598;
|
|
||||||
}
|
|
||||||
|
|
||||||
.logpane .wlabel {
|
|
||||||
width: 10em;
|
|
||||||
float: left;
|
|
||||||
margin-right:10px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.logpane .wvalue {
|
|
||||||
float: left;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* dashboard */
|
|
||||||
|
|
||||||
#dashboard {
|
|
||||||
width: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
.dashitem {
|
|
||||||
width:33%;
|
|
||||||
margin: 0px 2em 5em 0px;
|
|
||||||
padding: 5px 2em 5em;
|
|
||||||
vertical-align: top;
|
|
||||||
}
|
|
||||||
|
|
||||||
.dashitem:hover {
|
|
||||||
}
|
|
||||||
|
|
||||||
.dashitem a {
|
|
||||||
padding-top:2px;
|
|
||||||
padding-bottom: 10px;
|
|
||||||
display: block;
|
|
||||||
}
|
|
||||||
|
|
||||||
.dashitem img, #dashlocalesPopup h2 img {
|
|
||||||
float: left;
|
|
||||||
padding-right:10px;
|
|
||||||
width: 24px;
|
|
||||||
height: 24px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#dashlocalesPopup h2 img {
|
|
||||||
margin-top: -3px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#dashlocalesPopup .locales {
|
|
||||||
line-height: 180%;
|
|
||||||
margin-left:10px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#dashlocalesPopup h2 {
|
|
||||||
font-size: 1.5em;
|
|
||||||
margin-bottom: 0.9em;
|
|
||||||
padding: 5px 30px 0.8em 0px;
|
|
||||||
border-bottom: 2px solid #2F7598;
|
|
||||||
}
|
|
||||||
|
|
||||||
#dashlocalesPopupClose {
|
|
||||||
float: right;
|
|
||||||
position:absolute;
|
|
||||||
right:5px;
|
|
||||||
top:5px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#dashlocalesPopup {
|
|
||||||
display:none;
|
|
||||||
position:fixed;
|
|
||||||
_position:absolute; /* ie6*/
|
|
||||||
background:#FFFFFF;
|
|
||||||
border:2px solid #2F7598;
|
|
||||||
z-index:110;
|
|
||||||
padding:1em 1em;
|
|
||||||
font-size:1em;
|
|
||||||
}
|
|
||||||
|
|
||||||
#backgroundPopup{
|
|
||||||
display:none;
|
|
||||||
position:fixed;
|
|
||||||
_position:absolute; /* ie6*/
|
|
||||||
height:100%;
|
|
||||||
opacity: .5;
|
|
||||||
width:100%;
|
|
||||||
top:0;
|
|
||||||
left:0;
|
|
||||||
background:#000000;
|
|
||||||
border:1px solid #cecece;
|
|
||||||
z-index:101;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* install */
|
|
||||||
|
|
||||||
#install li {
|
|
||||||
list-style-type: circle;
|
|
||||||
list-style-position: inside;
|
|
||||||
margin-left: 2em;
|
|
||||||
}
|
|
||||||
|
|
||||||
#check-nv, #check-nm {
|
|
||||||
color: #2f7599;
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
#check-nv:hover, #check-nm:hover {
|
|
||||||
text-decoration: underline;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* chat */
|
|
||||||
|
|
||||||
.message {
|
|
||||||
font-family: Arial, Helvetica, sans-serif;
|
|
||||||
font-size: 12px;
|
|
||||||
color: #4F4F4F;
|
|
||||||
padding: 15px 0px 0px 0px;
|
|
||||||
line-height: 17px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.message span.time {
|
|
||||||
color: #000000;
|
|
||||||
}
|
|
||||||
|
|
||||||
.message span.nuser {
|
|
||||||
color: #B11E23;
|
|
||||||
font-weight: bold;
|
|
||||||
}
|
|
||||||
|
|
||||||
.message span.nagent {
|
|
||||||
font-weight: bold;
|
|
||||||
}
|
|
||||||
|
|
||||||
.message span.minf {
|
|
||||||
color: #1E48B1;
|
|
||||||
font-size: 11px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.message span.mevent {
|
|
||||||
color: #A1A1A1;
|
|
||||||
font-size: 11px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.message span.mhidden {
|
|
||||||
color: #A1A1A1;
|
|
||||||
font-size: 11px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.message span.mconn {
|
|
||||||
color: #A1A1A1;
|
|
||||||
font-size: 11px;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* updates */
|
|
||||||
|
|
||||||
#news {
|
|
||||||
font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;
|
|
||||||
font-size: 11px;
|
|
||||||
margin-bottom:15px;
|
|
||||||
padding:4px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.newstext {
|
|
||||||
margin-bottom:1em;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* rtl rules */
|
|
||||||
|
|
||||||
.lrtl .dashitem img, .lrtl #dashlocalesPopup h2 img, .lrtl #offwarn img {
|
|
||||||
float: right;
|
|
||||||
padding-right:0px;
|
|
||||||
padding-left:10px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.lrtl .fleftlabel {
|
|
||||||
float: right;
|
|
||||||
width: 11em;
|
|
||||||
}
|
|
||||||
|
|
||||||
.lrtl .fdescr {
|
|
||||||
float:right;
|
|
||||||
padding-right:10px;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
.lrtl .field .subfield {
|
|
||||||
padding-right: 30px;
|
|
||||||
background: url(images/subitem_rtl.gif) no-repeat 99% 2px;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
.lrtl .fvalue {
|
|
||||||
float: right;
|
|
||||||
}
|
|
||||||
|
|
||||||
.lrtl .logpane .wlabel {
|
|
||||||
float: right;
|
|
||||||
margin-left:10px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.lrtl .logpane .wvalue {
|
|
||||||
float: right;
|
|
||||||
}
|
|
||||||
|
|
||||||
.lrtl .fvaluewithta {
|
|
||||||
float: right;
|
|
||||||
}
|
|
||||||
|
|
||||||
.lrtl #togglediv {
|
|
||||||
float:left;
|
|
||||||
padding-left:10px;
|
|
||||||
}
|
|
0
src/mibew/files/avatar/.keep
Normal file
Before Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 732 B |
Before Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 728 B |
Before Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 604 B |
Before Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 1.3 KiB |
Before Width: | Height: | Size: 690 B |
Before Width: | Height: | Size: 1.1 KiB |
Before Width: | Height: | Size: 1.1 KiB |
@ -1,19 +0,0 @@
|
|||||||
"34aL volume 3.1" icons set
|
|
||||||
|
|
||||||
Ammount of icons:
|
|
||||||
60
|
|
||||||
|
|
||||||
Colors:
|
|
||||||
Colored, grey
|
|
||||||
|
|
||||||
Icon Sizes:
|
|
||||||
24x24
|
|
||||||
|
|
||||||
File Types:
|
|
||||||
.ico (RGBA, 256 color, 16 color),
|
|
||||||
.tiff (RGBA)
|
|
||||||
.gif (indexed)
|
|
||||||
.bmp (RGB - 1 color background),
|
|
||||||
.png (RGBA)
|
|
||||||
|
|
||||||
Note: These icons are free for use.
|
|
Before Width: | Height: | Size: 1.1 KiB |
Before Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 1.3 KiB |
Before Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 1.1 KiB |
Before Width: | Height: | Size: 328 B |
Before Width: | Height: | Size: 331 B |
@ -1,6 +1,8 @@
|
|||||||
<?php
|
<?php
|
||||||
/*
|
/*
|
||||||
* Copyright 2005-2014 the original author or authors.
|
* This file is a part of Mibew Messenger.
|
||||||
|
*
|
||||||
|
* Copyright 2005-2023 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@ -15,7 +17,58 @@
|
|||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
header("Location: operator/index.php");
|
// Initialize libraries
|
||||||
exit;
|
require_once(dirname(__FILE__) . '/libs/init.php');
|
||||||
|
|
||||||
?>
|
use Mibew\Application;
|
||||||
|
use Mibew\Authentication\AuthenticationManager;
|
||||||
|
use Mibew\Cache\CacheFactory;
|
||||||
|
use Mibew\Mail\MailerFactory;
|
||||||
|
use Mibew\Plugin\PluginManager;
|
||||||
|
use Mibew\Routing\Router;
|
||||||
|
use Mibew\Routing\Loader\CacheLoader;
|
||||||
|
use Mibew\Routing\Loader\PluginLoader;
|
||||||
|
use Symfony\Component\Config\FileLocator;
|
||||||
|
use Symfony\Component\Config\Loader\LoaderResolver;
|
||||||
|
use Symfony\Component\HttpFoundation\Request;
|
||||||
|
use Symfony\Component\Routing\Loader\YamlFileLoader;
|
||||||
|
|
||||||
|
$configs = load_system_configs();
|
||||||
|
|
||||||
|
// Prepare the cache
|
||||||
|
$cache_factory = new CacheFactory($configs['cache']);
|
||||||
|
// For now directory for cache files cannot be changed via the configs file.
|
||||||
|
// TODO: Evaluate possibility of using custom cache directory.
|
||||||
|
$cache_factory->setOption('path', MIBEW_FS_ROOT . '/cache/stash');
|
||||||
|
|
||||||
|
// Run plugins
|
||||||
|
if (get_maintenance_mode() === false) {
|
||||||
|
$plugin_manager = PluginManager::getInstance();
|
||||||
|
$plugin_manager->setCache($cache_factory->getCache());
|
||||||
|
$plugin_manager->loadPlugins($configs['plugins']);
|
||||||
|
}
|
||||||
|
|
||||||
|
// The main route loader which loads nothig but works as a cache proxy for other
|
||||||
|
// loaders.
|
||||||
|
$route_loader = new CacheLoader($cache_factory->getCache());
|
||||||
|
// Real loaders are attached via the resolver.
|
||||||
|
$loader_resolver = new LoaderResolver(array(
|
||||||
|
$route_loader,
|
||||||
|
new YamlFileLoader(new FileLocator(array(MIBEW_FS_ROOT))),
|
||||||
|
new PluginLoader(),
|
||||||
|
));
|
||||||
|
|
||||||
|
$router = new Router($route_loader, 'configs/routing.yml');
|
||||||
|
|
||||||
|
$application = new Application($router, new AuthenticationManager());
|
||||||
|
$application->setCache($cache_factory->getCache());
|
||||||
|
|
||||||
|
// Use custom config-dependent mailer factory
|
||||||
|
$application->setMailerFactory(new MailerFactory($configs['mailer']));
|
||||||
|
|
||||||
|
// Process request
|
||||||
|
$request = Request::createFromGlobals();
|
||||||
|
$response = $application->handleRequest($request);
|
||||||
|
|
||||||
|
// Send response to the user
|
||||||
|
$response->send();
|
||||||
|
23
src/mibew/index_fallback.php
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
<?php
|
||||||
|
/*
|
||||||
|
* This file is a part of Mibew Messenger.
|
||||||
|
*
|
||||||
|
* Copyright 2005-2023 the original author or authors.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Force the user to specify the entry point. This should be done only when
|
||||||
|
// mod_rewrite is not used by apache.
|
||||||
|
header('HTTP/1.0 301 Moved Permanently');
|
||||||
|
header('Location: index.php');
|
50
src/mibew/install.php
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
<?php
|
||||||
|
/*
|
||||||
|
* This file is a part of Mibew Messenger.
|
||||||
|
*
|
||||||
|
* Copyright 2005-2023 the original author or authors.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
define('MAINTENANCE_MODE', 'install');
|
||||||
|
|
||||||
|
// Initialize libraries
|
||||||
|
require_once(dirname(__FILE__) . '/libs/init.php');
|
||||||
|
|
||||||
|
use Mibew\Application;
|
||||||
|
use Mibew\Authentication\DummyAuthenticationManager;
|
||||||
|
use Mibew\Routing\Loader\DummyPluginLoader;
|
||||||
|
use Mibew\Routing\Router;
|
||||||
|
use Symfony\Component\Config\FileLocator;
|
||||||
|
use Symfony\Component\Config\Loader\LoaderResolver;
|
||||||
|
use Symfony\Component\HttpFoundation\Request;
|
||||||
|
use Symfony\Component\Routing\Loader\YamlFileLoader;
|
||||||
|
|
||||||
|
// Prepare router
|
||||||
|
$file_locator = new FileLocator(array(MIBEW_FS_ROOT));
|
||||||
|
$route_loader = new YamlFileLoader($file_locator);
|
||||||
|
$loader_resolver = new LoaderResolver(array(
|
||||||
|
$route_loader,
|
||||||
|
new DummyPluginLoader(),
|
||||||
|
));
|
||||||
|
$router = new Router($route_loader, 'configs/routing_install.yml');
|
||||||
|
|
||||||
|
$application = new Application($router, new DummyAuthenticationManager());
|
||||||
|
|
||||||
|
// Process request
|
||||||
|
$request = Request::createFromGlobals();
|
||||||
|
$response = $application->handleRequest($request);
|
||||||
|
|
||||||
|
// Send response to the user
|
||||||
|
$response->send();
|
@ -1,229 +0,0 @@
|
|||||||
<?php
|
|
||||||
/*
|
|
||||||
* Copyright 2005-2014 the original author or authors.
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
$dbtables = array(
|
|
||||||
"${mysqlprefix}chatgroup" => array(
|
|
||||||
"groupid" => "int NOT NULL auto_increment PRIMARY KEY",
|
|
||||||
"vcemail" => "varchar(64)",
|
|
||||||
"vclocalname" => "varchar(64) NOT NULL",
|
|
||||||
"vccommonname" => "varchar(64) NOT NULL",
|
|
||||||
"vclocaldescription" => "varchar(1024) NOT NULL",
|
|
||||||
"vccommondescription" => "varchar(1024) NOT NULL",
|
|
||||||
),
|
|
||||||
|
|
||||||
"${mysqlprefix}chatthread" => array(
|
|
||||||
"threadid" => "int NOT NULL auto_increment PRIMARY KEY",
|
|
||||||
"userName" => "varchar(64) NOT NULL",
|
|
||||||
"userid" => "varchar(255)",
|
|
||||||
"agentName" => "varchar(64)",
|
|
||||||
"agentId" => "int NOT NULL DEFAULT 0",
|
|
||||||
"dtmcreated" => "datetime DEFAULT 0",
|
|
||||||
"dtmmodified" => "datetime DEFAULT 0",
|
|
||||||
"lrevision" => "int NOT NULL DEFAULT 0",
|
|
||||||
"istate" => "int NOT NULL DEFAULT 0",
|
|
||||||
"ltoken" => "int NOT NULL",
|
|
||||||
"remote" => "varchar(255)",
|
|
||||||
"referer" => "text",
|
|
||||||
"nextagent" => "int NOT NULL DEFAULT 0",
|
|
||||||
"locale" => "varchar(8)",
|
|
||||||
"lastpinguser" => "datetime DEFAULT 0",
|
|
||||||
"lastpingagent" => "datetime DEFAULT 0",
|
|
||||||
"userTyping" => "int DEFAULT 0",
|
|
||||||
"agentTyping" => "int DEFAULT 0",
|
|
||||||
"shownmessageid" => "int NOT NULL DEFAULT 0",
|
|
||||||
"userAgent" => "varchar(255)",
|
|
||||||
"messageCount" => "varchar(16)",
|
|
||||||
"groupid" => "int references ${mysqlprefix}chatgroup(groupid)",
|
|
||||||
),
|
|
||||||
|
|
||||||
"${mysqlprefix}chatmessage" => array(
|
|
||||||
"messageid" => "int NOT NULL auto_increment PRIMARY KEY",
|
|
||||||
"threadid" => "int NOT NULL references ${mysqlprefix}chatthread(threadid)",
|
|
||||||
"ikind" => "int NOT NULL",
|
|
||||||
"agentId" => "int NOT NULL DEFAULT 0",
|
|
||||||
"tmessage" => "text NOT NULL",
|
|
||||||
"dtmcreated" => "datetime DEFAULT 0",
|
|
||||||
"tname" => "varchar(64)"
|
|
||||||
),
|
|
||||||
|
|
||||||
"${mysqlprefix}chatoperator" => array(
|
|
||||||
"operatorid" => "int NOT NULL auto_increment PRIMARY KEY",
|
|
||||||
"vclogin" => "varchar(64) NOT NULL",
|
|
||||||
"vcpassword" => "varchar(64) NOT NULL",
|
|
||||||
"vclocalename" => "varchar(64) NOT NULL",
|
|
||||||
"vccommonname" => "varchar(64) NOT NULL",
|
|
||||||
"vcemail" => "varchar(64)",
|
|
||||||
"dtmlastvisited" => "datetime DEFAULT 0",
|
|
||||||
"istatus" => "int DEFAULT 0", /* 0 - online, 1 - away */
|
|
||||||
"vcavatar" => "varchar(255)",
|
|
||||||
"vcjabbername" => "varchar(255)",
|
|
||||||
"iperm" => "int DEFAULT 65535",
|
|
||||||
"inotify" => "int DEFAULT 0", /* 0 - none, 1 - jabber */
|
|
||||||
"dtmrestore" => "datetime DEFAULT 0",
|
|
||||||
"vcrestoretoken" => "varchar(64)",
|
|
||||||
),
|
|
||||||
|
|
||||||
"${mysqlprefix}chatrevision" => array(
|
|
||||||
"id" => "INT NOT NULL"
|
|
||||||
),
|
|
||||||
|
|
||||||
"${mysqlprefix}chatgroupoperator" => array(
|
|
||||||
"groupid" => "int NOT NULL references ${mysqlprefix}chatgroup(groupid)",
|
|
||||||
"operatorid" => "int NOT NULL references ${mysqlprefix}chatoperator(operatorid)",
|
|
||||||
),
|
|
||||||
|
|
||||||
"${mysqlprefix}chatban" => array(
|
|
||||||
"banid" => "INT NOT NULL auto_increment PRIMARY KEY",
|
|
||||||
"dtmcreated" => "datetime DEFAULT 0",
|
|
||||||
"dtmtill" => "datetime DEFAULT 0",
|
|
||||||
"address" => "varchar(255)",
|
|
||||||
"comment" => "varchar(255)",
|
|
||||||
"blockedCount" => "int DEFAULT 0"
|
|
||||||
),
|
|
||||||
|
|
||||||
"${mysqlprefix}chatconfig" => array(
|
|
||||||
"id" => "INT NOT NULL auto_increment PRIMARY KEY",
|
|
||||||
"vckey" => "varchar(255)",
|
|
||||||
"vcvalue" => "varchar(255)",
|
|
||||||
),
|
|
||||||
|
|
||||||
"${mysqlprefix}chatresponses" => array(
|
|
||||||
"id" => "INT NOT NULL auto_increment PRIMARY KEY",
|
|
||||||
"locale" => "varchar(8)",
|
|
||||||
"groupid" => "int references ${mysqlprefix}chatgroup(groupid)",
|
|
||||||
"vcvalue" => "varchar(1024) NOT NULL",
|
|
||||||
),
|
|
||||||
|
|
||||||
"${mysqlprefix}chatnotification" => array(
|
|
||||||
"id" => "INT NOT NULL auto_increment PRIMARY KEY",
|
|
||||||
"locale" => "varchar(8)",
|
|
||||||
"vckind" => "varchar(16)",
|
|
||||||
"vcto" => "varchar(256)",
|
|
||||||
"dtmcreated" => "datetime DEFAULT 0",
|
|
||||||
"vcsubject" => "varchar(256)",
|
|
||||||
"tmessage" => "text NOT NULL",
|
|
||||||
"refoperator" => "int NOT NULL references ${mysqlprefix}chatoperator(operatorid)",
|
|
||||||
),
|
|
||||||
);
|
|
||||||
|
|
||||||
$dbtables_indexes = array(
|
|
||||||
"${mysqlprefix}chatmessage" => array(
|
|
||||||
"idx_agentid" => "agentid"
|
|
||||||
)
|
|
||||||
);
|
|
||||||
|
|
||||||
$memtables = array();
|
|
||||||
|
|
||||||
$dbtables_can_update = array(
|
|
||||||
"${mysqlprefix}chatthread" => array("agentId", "userTyping", "agentTyping", "messageCount", "nextagent", "shownmessageid", "userid", "userAgent", "groupid"),
|
|
||||||
"${mysqlprefix}chatmessage" => array("agentId"),
|
|
||||||
"${mysqlprefix}chatoperator" => array("vcavatar", "vcjabbername", "iperm", "istatus", "vcemail", "dtmrestore", "vcrestoretoken", "inotify"),
|
|
||||||
"${mysqlprefix}chatban" => array(),
|
|
||||||
"${mysqlprefix}chatgroup" => array("vcemail"),
|
|
||||||
"${mysqlprefix}chatgroupoperator" => array(),
|
|
||||||
"${mysqlprefix}chatresponses" => array(),
|
|
||||||
"${mysqlprefix}chatnotification" => array(),
|
|
||||||
);
|
|
||||||
|
|
||||||
function show_install_err($text)
|
|
||||||
{
|
|
||||||
global $page, $version, $errors, $mibewroot;
|
|
||||||
$page = array(
|
|
||||||
'version' => $version,
|
|
||||||
'localeLinks' => get_locale_links("$mibewroot/install/index.php")
|
|
||||||
);
|
|
||||||
$errors = array($text);
|
|
||||||
start_html_output();
|
|
||||||
require('../view/install_err.php');
|
|
||||||
exit;
|
|
||||||
}
|
|
||||||
|
|
||||||
function create_table($id, $link)
|
|
||||||
{
|
|
||||||
global $dbtables, $dbtables_indexes, $memtables, $dbencoding, $mysqlprefix;
|
|
||||||
|
|
||||||
if (!isset($dbtables[$id])) {
|
|
||||||
show_install_err("Unknown table: $id, " . mysql_error($link));
|
|
||||||
}
|
|
||||||
|
|
||||||
$query =
|
|
||||||
"CREATE TABLE $id\n" .
|
|
||||||
"(\n";
|
|
||||||
foreach ($dbtables[$id] as $k => $v) {
|
|
||||||
$query .= " $k $v,\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
if (isset($dbtables_indexes[$id])) {
|
|
||||||
foreach ($dbtables_indexes[$id] as $k => $v) {
|
|
||||||
$query .= " INDEX $k ($v),\n";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$query = preg_replace("/,\n$/", "", $query);
|
|
||||||
$query .= ") charset $dbencoding";
|
|
||||||
if (in_array($id, $memtables)) {
|
|
||||||
$query .= " ENGINE=MEMORY";
|
|
||||||
} else {
|
|
||||||
$query .= " ENGINE=InnoDb";
|
|
||||||
}
|
|
||||||
|
|
||||||
mysql_query($query, $link) or show_install_err(' Query failed: ' . mysql_error($link));
|
|
||||||
|
|
||||||
if ($id == "${mysqlprefix}chatoperator") {
|
|
||||||
create_operator_("admin", "", "", "", "Administrator", "Administrator", 0, "", $link);
|
|
||||||
} else if ($id == "${mysqlprefix}chatrevision") {
|
|
||||||
perform_query("INSERT INTO ${mysqlprefix}chatrevision VALUES (1)", $link);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function get_tables($link)
|
|
||||||
{
|
|
||||||
global $mysqldb, $errors;
|
|
||||||
$result = mysql_query("SHOW TABLES FROM `$mysqldb`", $link);
|
|
||||||
if ($result) {
|
|
||||||
$arr = array();
|
|
||||||
while ($row = mysql_fetch_array($result, MYSQL_NUM)) {
|
|
||||||
$arr[] = $row[0];
|
|
||||||
}
|
|
||||||
mysql_free_result($result);
|
|
||||||
return $arr;
|
|
||||||
|
|
||||||
} else {
|
|
||||||
$errors[] = "Cannot get tables from database. Error: " . mysql_error($link);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function get_columns($tablename, $link)
|
|
||||||
{
|
|
||||||
global $errors;
|
|
||||||
$result = mysql_query("SHOW COLUMNS FROM $tablename", $link);
|
|
||||||
if ($result) {
|
|
||||||
$arr = array();
|
|
||||||
while ($row = mysql_fetch_array($result, MYSQL_NUM)) {
|
|
||||||
$arr[] = $row[0];
|
|
||||||
}
|
|
||||||
mysql_free_result($result);
|
|
||||||
return $arr;
|
|
||||||
|
|
||||||
} else {
|
|
||||||
$errors[] = "Cannot get columns from table \"$tablename\". Error: " . mysql_error($link);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
?>
|
|
@ -1,168 +0,0 @@
|
|||||||
<?php
|
|
||||||
/*
|
|
||||||
* Copyright 2005-2014 the original author or authors.
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
require_once('../libs/common.php');
|
|
||||||
require_once('../libs/operator.php');
|
|
||||||
require_once('dbinfo.php');
|
|
||||||
|
|
||||||
function runsql($query, $link)
|
|
||||||
{
|
|
||||||
$res = mysql_query($query, $link) or show_install_err(' Query failed: ' . mysql_error($link));
|
|
||||||
return $res;
|
|
||||||
}
|
|
||||||
|
|
||||||
$act = verifyparam("act", "/^(silentcreateall|createdb|ct|dt|addcolumns)$/");
|
|
||||||
|
|
||||||
$link = @mysql_connect($mysqlhost, $mysqllogin, $mysqlpass)
|
|
||||||
or show_install_err('Could not connect: ' . mysql_error());
|
|
||||||
|
|
||||||
if ($act == "silentcreateall") {
|
|
||||||
mysql_query("CREATE DATABASE $mysqldb", $link) or show_install_err(' Query failed: ' . mysql_error($link));
|
|
||||||
foreach ($dbtables as $id) {
|
|
||||||
create_table($id, $link);
|
|
||||||
}
|
|
||||||
} else if ($act == "createdb") {
|
|
||||||
mysql_query("CREATE DATABASE $mysqldb", $link) or show_install_err(' Query failed: ' . mysql_error($link));
|
|
||||||
} else {
|
|
||||||
mysql_select_db($mysqldb, $link)
|
|
||||||
or show_install_err('Could not select database');
|
|
||||||
if ($force_charset_in_connection) {
|
|
||||||
mysql_query("SET character set $dbencoding", $link);
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($act == "ct") {
|
|
||||||
$curr_tables = get_tables($link);
|
|
||||||
if ($curr_tables === false) {
|
|
||||||
show_install_err($errors[0]);
|
|
||||||
}
|
|
||||||
$tocreate = array_diff(array_keys($dbtables), $curr_tables);
|
|
||||||
foreach ($tocreate as $id) {
|
|
||||||
create_table($id, $link);
|
|
||||||
}
|
|
||||||
} else if ($act == "dt") {
|
|
||||||
|
|
||||||
# comment this line to be able to drop tables
|
|
||||||
show_install_err("For security reasons, removing tables is disabled by default");
|
|
||||||
|
|
||||||
foreach (array_keys($dbtables) as $id) {
|
|
||||||
mysql_query("DROP TABLE IF EXISTS $id", $link) or show_install_err(' Query failed: ' . mysql_error($link));
|
|
||||||
}
|
|
||||||
} else if ($act == "addcolumns") {
|
|
||||||
$absent = array();
|
|
||||||
foreach ($dbtables as $id => $columns) {
|
|
||||||
$curr_columns = get_columns($id, $link);
|
|
||||||
if ($curr_columns === false) {
|
|
||||||
show_install_err($errors[0]);
|
|
||||||
}
|
|
||||||
$tocreate = array_diff(array_keys($columns), $curr_columns);
|
|
||||||
foreach ($tocreate as $v) {
|
|
||||||
$absent[] = "$id.$v";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (in_array("${mysqlprefix}chatmessage.agentId", $absent)) {
|
|
||||||
runsql("ALTER TABLE ${mysqlprefix}chatmessage ADD agentId int NOT NULL DEFAULT 0 AFTER ikind", $link);
|
|
||||||
runsql("update ${mysqlprefix}chatmessage, ${mysqlprefix}chatoperator set agentId = operatorid where agentId = 0 AND ikind = 2 AND (vclocalename = tname OR vccommonname = tname)", $link);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (in_array("${mysqlprefix}chatthread.agentId", $absent)) {
|
|
||||||
runsql("ALTER TABLE ${mysqlprefix}chatthread ADD agentId int NOT NULL DEFAULT 0 AFTER agentName", $link);
|
|
||||||
runsql("update ${mysqlprefix}chatthread, ${mysqlprefix}chatoperator set agentId = operatorid where agentId = 0 AND (vclocalename = agentName OR vccommonname = agentName)", $link);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (in_array("${mysqlprefix}chatthread.agentTyping", $absent)) {
|
|
||||||
runsql("ALTER TABLE ${mysqlprefix}chatthread ADD agentTyping int DEFAULT 0", $link);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (in_array("${mysqlprefix}chatthread.userTyping", $absent)) {
|
|
||||||
runsql("ALTER TABLE ${mysqlprefix}chatthread ADD userTyping int DEFAULT 0", $link);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (in_array("${mysqlprefix}chatthread.messageCount", $absent)) {
|
|
||||||
runsql("ALTER TABLE ${mysqlprefix}chatthread ADD messageCount varchar(16)", $link);
|
|
||||||
runsql("ALTER TABLE ${mysqlprefix}chatmessage ADD INDEX idx_threadid_ikind (threadid, ikind)", $link);
|
|
||||||
runsql("UPDATE ${mysqlprefix}chatthread t SET t.messageCount = (SELECT COUNT(*) FROM ${mysqlprefix}chatmessage WHERE ${mysqlprefix}chatmessage.threadid = t.threadid AND ikind = 1)", $link);
|
|
||||||
runsql("ALTER TABLE ${mysqlprefix}chatmessage DROP INDEX idx_threadid_ikind", $link);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (in_array("${mysqlprefix}chatthread.nextagent", $absent)) {
|
|
||||||
runsql("ALTER TABLE ${mysqlprefix}chatthread ADD nextagent int NOT NULL DEFAULT 0", $link);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (in_array("${mysqlprefix}chatthread.shownmessageid", $absent)) {
|
|
||||||
runsql("ALTER TABLE ${mysqlprefix}chatthread ADD shownmessageid int NOT NULL DEFAULT 0", $link);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (in_array("${mysqlprefix}chatthread.userid", $absent)) {
|
|
||||||
runsql("ALTER TABLE ${mysqlprefix}chatthread ADD userid varchar(255) DEFAULT \"\"", $link);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (in_array("${mysqlprefix}chatoperator.iperm", $absent)) {
|
|
||||||
runsql("ALTER TABLE ${mysqlprefix}chatoperator ADD iperm int DEFAULT 65535", $link);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (in_array("${mysqlprefix}chatoperator.istatus", $absent)) {
|
|
||||||
runsql("ALTER TABLE ${mysqlprefix}chatoperator ADD istatus int DEFAULT 0", $link);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (in_array("${mysqlprefix}chatoperator.inotify", $absent)) {
|
|
||||||
runsql("ALTER TABLE ${mysqlprefix}chatoperator ADD inotify int DEFAULT 0", $link);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (in_array("${mysqlprefix}chatoperator.vcavatar", $absent)) {
|
|
||||||
runsql("ALTER TABLE ${mysqlprefix}chatoperator ADD vcavatar varchar(255)", $link);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (in_array("${mysqlprefix}chatoperator.vcjabbername", $absent)) {
|
|
||||||
runsql("ALTER TABLE ${mysqlprefix}chatoperator ADD vcjabbername varchar(255)", $link);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (in_array("${mysqlprefix}chatoperator.vcemail", $absent)) {
|
|
||||||
runsql("ALTER TABLE ${mysqlprefix}chatoperator ADD vcemail varchar(64)", $link);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (in_array("${mysqlprefix}chatoperator.dtmrestore", $absent)) {
|
|
||||||
runsql("ALTER TABLE ${mysqlprefix}chatoperator ADD dtmrestore datetime DEFAULT 0", $link);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (in_array("${mysqlprefix}chatoperator.vcrestoretoken", $absent)) {
|
|
||||||
runsql("ALTER TABLE ${mysqlprefix}chatoperator ADD vcrestoretoken varchar(64)", $link);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (in_array("${mysqlprefix}chatthread.groupid", $absent)) {
|
|
||||||
runsql("ALTER TABLE ${mysqlprefix}chatthread ADD groupid int references ${mysqlprefix}chatgroup(groupid)", $link);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (in_array("${mysqlprefix}chatthread.userAgent", $absent)) {
|
|
||||||
runsql("ALTER TABLE ${mysqlprefix}chatthread ADD userAgent varchar(255)", $link);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (in_array("${mysqlprefix}chatgroup.vcemail", $absent)) {
|
|
||||||
runsql("ALTER TABLE ${mysqlprefix}chatgroup ADD vcemail varchar(64)", $link);
|
|
||||||
}
|
|
||||||
|
|
||||||
$res = mysql_query("select null from information_schema.statistics where table_schema = '$mysqldb' and table_name = '${mysqlprefix}chatmessage' and index_name = 'idx_agentid'", $link);
|
|
||||||
if ($res && mysql_num_rows($res) == 0) {
|
|
||||||
runsql("ALTER TABLE ${mysqlprefix}chatmessage ADD INDEX idx_agentid (agentid)", $link);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
mysql_close($link);
|
|
||||||
header("Location: $mibewroot/install/index.php");
|
|
||||||
exit;
|
|
||||||
?>
|
|
@ -1,329 +0,0 @@
|
|||||||
<?php
|
|
||||||
/*
|
|
||||||
* Copyright 2005-2014 the original author or authors.
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
require_once('../libs/common.php');
|
|
||||||
require_once('../libs/settings.php');
|
|
||||||
require_once('dbinfo.php');
|
|
||||||
|
|
||||||
$page = array(
|
|
||||||
'version' => $version,
|
|
||||||
'localeLinks' => get_locale_links("$mibewroot/install/index.php")
|
|
||||||
);
|
|
||||||
|
|
||||||
$page['done'] = array();
|
|
||||||
$page['nextstep'] = false;
|
|
||||||
$page['nextnotice'] = false;
|
|
||||||
$page['soundcheck'] = false;
|
|
||||||
$errors = array();
|
|
||||||
|
|
||||||
function check_mibewroot()
|
|
||||||
{
|
|
||||||
global $page, $errors, $mibewroot;
|
|
||||||
$requestUri = $_SERVER["REQUEST_URI"];
|
|
||||||
if (!preg_match('/^(.*)\\/install(\\/[^\\/\\\\]*)?$/', $requestUri, $matches)) {
|
|
||||||
$errors[] = "Cannot detect application location: $requestUri";
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
$applocation = $matches[1];
|
|
||||||
|
|
||||||
if ($applocation != $mibewroot) {
|
|
||||||
$errors[] = "Please, check file ${applocation}/libs/config.php<br/>Wrong value of \$mibewroot variable, should be \"$applocation\"";
|
|
||||||
$mibewroot = $applocation;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
$page['done'][] = getlocal2("install.0.app", array($applocation));
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
function fpermissions($file)
|
|
||||||
{
|
|
||||||
$perms = fileperms($file);
|
|
||||||
if (($perms & 0x8000) == 0x8000) {
|
|
||||||
$info = '-';
|
|
||||||
} elseif (($perms & 0x4000) == 0x4000) {
|
|
||||||
$info = 'd';
|
|
||||||
} else {
|
|
||||||
$info = '?';
|
|
||||||
}
|
|
||||||
|
|
||||||
// Owner
|
|
||||||
$info .= (($perms & 0x0100) ? 'r' : '-');
|
|
||||||
$info .= (($perms & 0x0080) ? 'w' : '-');
|
|
||||||
$info .= (($perms & 0x0040) ?
|
|
||||||
(($perms & 0x0800) ? 's' : 'x') :
|
|
||||||
(($perms & 0x0800) ? 'S' : '-'));
|
|
||||||
|
|
||||||
// Group
|
|
||||||
$info .= (($perms & 0x0020) ? 'r' : '-');
|
|
||||||
$info .= (($perms & 0x0010) ? 'w' : '-');
|
|
||||||
$info .= (($perms & 0x0008) ?
|
|
||||||
(($perms & 0x0400) ? 's' : 'x') :
|
|
||||||
(($perms & 0x0400) ? 'S' : '-'));
|
|
||||||
|
|
||||||
// World
|
|
||||||
$info .= (($perms & 0x0004) ? 'r' : '-');
|
|
||||||
$info .= (($perms & 0x0002) ? 'w' : '-');
|
|
||||||
$info .= (($perms & 0x0001) ?
|
|
||||||
(($perms & 0x0200) ? 't' : 'x') :
|
|
||||||
(($perms & 0x0200) ? 'T' : '-'));
|
|
||||||
|
|
||||||
return $info;
|
|
||||||
}
|
|
||||||
|
|
||||||
function check_files()
|
|
||||||
{
|
|
||||||
global $page, $errors, $mibewroot;
|
|
||||||
|
|
||||||
$packageFile = dirname(__FILE__) . "/package";
|
|
||||||
$fp = @fopen($packageFile, "r");
|
|
||||||
if ($fp === FALSE) {
|
|
||||||
$errors[] = getlocal2("install.cannot_read", array("$mibewroot/install/package"));
|
|
||||||
if (file_exists($packageFile)) {
|
|
||||||
$errors[] = getlocal2("install.check_permissions", array(fpermissions($packageFile)));
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
$knownFiles = array();
|
|
||||||
while (!feof($fp)) {
|
|
||||||
$line = fgets($fp, 4096);
|
|
||||||
$keyval = preg_split("/ /", $line, 2);
|
|
||||||
if (isset($keyval[1])) {
|
|
||||||
$knownFiles[$keyval[0]] = trim($keyval[1]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
fclose($fp);
|
|
||||||
|
|
||||||
foreach ($knownFiles as $file => $sum) {
|
|
||||||
$relativeName = dirname(__FILE__) . "/../$file";
|
|
||||||
if (!is_readable($relativeName)) {
|
|
||||||
if (file_exists($relativeName)) {
|
|
||||||
$errors[] = getlocal2("install.cannot_read", array("$mibewroot/$file"));
|
|
||||||
$errors[] = getlocal2("install.check_permissions", array(fpermissions($relativeName)));
|
|
||||||
} else {
|
|
||||||
$errors[] = getlocal2("install.no_file", array("$mibewroot/$file"));
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if ($sum != "-") {
|
|
||||||
$result = md5_file($relativeName);
|
|
||||||
if ($result != $sum) {
|
|
||||||
// try without \r
|
|
||||||
$result = md5(str_replace("\r", "", file_get_contents($relativeName)));
|
|
||||||
}
|
|
||||||
if ($result != $sum) {
|
|
||||||
$errors[] = getlocal2("install.bad_checksum", array("$mibewroot/$file"));
|
|
||||||
$errors[] = getlocal("install.check_files");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$page['done'][] = getlocal("install.0.package");
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
function check_connection()
|
|
||||||
{
|
|
||||||
global $mysqlhost, $mysqllogin, $mysqlpass, $page, $errors, $mibewroot;
|
|
||||||
$link = @mysql_connect($mysqlhost, $mysqllogin, $mysqlpass);
|
|
||||||
if ($link) {
|
|
||||||
$result = mysql_query("SELECT VERSION() as c", $link);
|
|
||||||
if ($result && $ver = mysql_fetch_array($result, MYSQL_ASSOC)) {
|
|
||||||
$page['done'][] = getlocal2("install.1.connected", array($ver['c']));
|
|
||||||
mysql_free_result($result);
|
|
||||||
} else {
|
|
||||||
$errors[] = "Version of your SQL server is unknown. Please check. Error: " . mysql_error($link);
|
|
||||||
mysql_close($link);
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
return $link;
|
|
||||||
} else {
|
|
||||||
$errors[] = getlocal2("install.connection.error", array(mysql_error()));
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function check_database($link)
|
|
||||||
{
|
|
||||||
global $mysqldb, $force_charset_in_connection, $dbencoding, $page, $mibewroot;
|
|
||||||
if (mysql_select_db($mysqldb, $link)) {
|
|
||||||
$page['done'][] = getlocal2("install.2.db_exists", array($mysqldb));
|
|
||||||
if ($force_charset_in_connection) {
|
|
||||||
mysql_query("SET character set $dbencoding", $link);
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
} else {
|
|
||||||
$page['nextstep'] = getlocal2("install.2.create", array($mysqldb));
|
|
||||||
$page['nextnotice'] = getlocal("install.2.notice");
|
|
||||||
$page['nextstepurl'] = "$mibewroot/install/dbperform.php?act=createdb";
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
function check_tables($link)
|
|
||||||
{
|
|
||||||
global $dbtables, $page, $mibewroot;
|
|
||||||
$curr_tables = get_tables($link);
|
|
||||||
if ($curr_tables !== false) {
|
|
||||||
$tocreate = array_diff(array_keys($dbtables), $curr_tables);
|
|
||||||
if (count($tocreate) == 0) {
|
|
||||||
$page['done'][] = getlocal("install.3.tables_exist");
|
|
||||||
return true;
|
|
||||||
} else {
|
|
||||||
$page['nextstep'] = getlocal("install.3.create");
|
|
||||||
$page['nextstepurl'] = "$mibewroot/install/dbperform.php?act=ct";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
function check_columns($link)
|
|
||||||
{
|
|
||||||
global $dbtables, $dbtables_can_update, $errors, $page, $mibewroot;
|
|
||||||
|
|
||||||
$need_to_create_columns = false;
|
|
||||||
foreach ($dbtables as $id => $columns) {
|
|
||||||
$curr_columns = get_columns($id, $link);
|
|
||||||
if ($curr_columns === false) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
$tocreate = array_diff(array_keys($columns), $curr_columns);
|
|
||||||
if (count($tocreate) != 0) {
|
|
||||||
$cannot_update = array_diff($tocreate, $dbtables_can_update[$id]);
|
|
||||||
if (count($cannot_update) != 0) {
|
|
||||||
$errors[] = "Key columns are absent in table `$id'. Unable to continue installation.";
|
|
||||||
$page['nextstep'] = getlocal("install.kill_tables");
|
|
||||||
$page['nextstepurl'] = "$mibewroot/install/dbperform.php?act=dt";
|
|
||||||
$page['nextnotice'] = getlocal("install.kill_tables.notice");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
$need_to_create_columns = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($need_to_create_columns) {
|
|
||||||
$page['nextstep'] = getlocal("install.4.create");
|
|
||||||
$page['nextstepurl'] = "$mibewroot/install/dbperform.php?act=addcolumns";
|
|
||||||
$page['nextnotice'] = getlocal("install.4.notice");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
$page['done'][] = getlocal("install.4.done");
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
function check_sound()
|
|
||||||
{
|
|
||||||
global $page;
|
|
||||||
|
|
||||||
$page['soundcheck'] = true;
|
|
||||||
$page['done'][] = getlocal2("install.5.text", array(
|
|
||||||
"<a id=\"check-nv\" href=\"javascript:void(0)\">" . getlocal("install.5.newvisitor") . "</a>",
|
|
||||||
"<a id=\"check-nm\" href=\"javascript:void(0)\">" . getlocal("install.5.newmessage") . "</a>"
|
|
||||||
));
|
|
||||||
}
|
|
||||||
|
|
||||||
function check_admin($link)
|
|
||||||
{
|
|
||||||
global $mysqlprefix;
|
|
||||||
$result = mysql_query("select * from ${mysqlprefix}chatoperator where vclogin = 'admin'", $link);
|
|
||||||
if ($result) {
|
|
||||||
$line = mysql_fetch_array($result, MYSQL_ASSOC);
|
|
||||||
mysql_free_result($result);
|
|
||||||
return $line['vcpassword'] != md5('');
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
function remove_low_level_settings($link)
|
|
||||||
{
|
|
||||||
global $mysqlprefix, $low_level_settings;
|
|
||||||
foreach ($low_level_settings as $key) {
|
|
||||||
if (!mysql_query("delete from ${mysqlprefix}chatconfig where vckey = '" . mysql_real_escape_string($key, $link) . "'", $link)) {
|
|
||||||
$errors[] = "Unable to remove low level setting " . htmlspecialchars($key) . " from the database. Error: " . mysql_error($link);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
function check_status()
|
|
||||||
{
|
|
||||||
global $page, $mibewroot, $settings, $dbversion;
|
|
||||||
|
|
||||||
$page['done'][] = getlocal2("install.0.php", array(phpversion()));
|
|
||||||
|
|
||||||
if (!check_mibewroot()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!check_files()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
$link = check_connection();
|
|
||||||
if (!$link) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!check_database($link)) {
|
|
||||||
mysql_close($link);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!check_tables($link)) {
|
|
||||||
mysql_close($link);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!check_columns($link)) {
|
|
||||||
mysql_close($link);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!remove_low_level_settings($link)) {
|
|
||||||
mysql_close($link);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
check_sound();
|
|
||||||
|
|
||||||
$page['done'][] = getlocal("installed.message");
|
|
||||||
|
|
||||||
if (!check_admin($link)) {
|
|
||||||
$page['nextstep'] = getlocal("installed.login_link");
|
|
||||||
$page['nextnotice'] = getlocal2("installed.notice", array("${mibewroot}/install/"));
|
|
||||||
$page['nextstepurl'] = "$mibewroot/operator/login.php?login=admin";
|
|
||||||
}
|
|
||||||
|
|
||||||
$page['show_small_login'] = true;
|
|
||||||
|
|
||||||
mysql_close($link);
|
|
||||||
|
|
||||||
loadsettings();
|
|
||||||
$settings['dbversion'] = $dbversion;
|
|
||||||
update_settings();
|
|
||||||
}
|
|
||||||
|
|
||||||
check_status();
|
|
||||||
|
|
||||||
start_html_output();
|
|
||||||
require('../view/install_index.php');
|
|
||||||
?>
|
|
@ -1,226 +0,0 @@
|
|||||||
1.6.11
|
|
||||||
-----
|
|
||||||
[!] fix support of unicode
|
|
||||||
|
|
||||||
1.6.10
|
|
||||||
-----
|
|
||||||
[!] multiple bugfixes
|
|
||||||
[+] switch to opt-in policy for open_basedir protection
|
|
||||||
|
|
||||||
1.6.9
|
|
||||||
-----
|
|
||||||
[!] multiple bugfixes
|
|
||||||
[!] multiple security fixes (thanks to X Chen)
|
|
||||||
[+] new permission for operators to see Notifications (thanks to Borja Rubio)
|
|
||||||
|
|
||||||
1.6.8
|
|
||||||
-----
|
|
||||||
[!] multiple bugfixes
|
|
||||||
[!] several security fixes
|
|
||||||
[+] new logo
|
|
||||||
[!] switch to standard codes for several locales
|
|
||||||
|
|
||||||
1.6.7
|
|
||||||
-----
|
|
||||||
[+] add https links highlighting (thanks to falcon)
|
|
||||||
[!] fix several bugs related to specific environments
|
|
||||||
|
|
||||||
1.6.6
|
|
||||||
-----
|
|
||||||
[+] add captcha image to pre-chat survey
|
|
||||||
[+] improve localization (add new constants)
|
|
||||||
[!] completely abandon old application name (i.e. webim)
|
|
||||||
[!] switch to more safe hashing alrgorithms for passwords and tokens
|
|
||||||
[!] switch to more safe generation of user IDs
|
|
||||||
[!] make important cookies more safe
|
|
||||||
[!] multiple XSS fixes
|
|
||||||
[!] multiple SQL Injection fixes
|
|
||||||
[!] multiple file path manipulation fixes
|
|
||||||
[!] CSRF fixes
|
|
||||||
|
|
||||||
1.6.5
|
|
||||||
-----
|
|
||||||
[+] Apache 2 license
|
|
||||||
[+] switched to google closure compiler for Javascript compression, jQuery 1.4.2
|
|
||||||
[+] improve database schema (add indexes, fix compatibility with MySQL 5.5)
|
|
||||||
[+] silver skin (thanks to Alekin Pavel)
|
|
||||||
[+] informational banner on empty password of administrator
|
|
||||||
[!] CSRF fixes
|
|
||||||
[!] close old threads by timeout
|
|
||||||
|
|
||||||
1.6.4
|
|
||||||
-----
|
|
||||||
[+] core UI improvements, "you are offline" and "new features" notification panels
|
|
||||||
[+] online/away operators list (on "awaiting visitors" page) by Andrew Armstrong
|
|
||||||
[+] several instances of mibew in one DB ($mysqlprefix variable)
|
|
||||||
[+] ability to override notification email for group
|
|
||||||
[!] various compatibility fixes: button image, captcha, check webimroot variable (installation)
|
|
||||||
[!] check file permissions/checksum (installation)
|
|
||||||
[!] fix speed of history search, fix redirection to groups
|
|
||||||
[!] fix sound issues in windows
|
|
||||||
|
|
||||||
1.6.3
|
|
||||||
-----
|
|
||||||
[+] password restore functionality for agent
|
|
||||||
[+] new Blue logo; new buttons: mgreen, mblue
|
|
||||||
[!] fixed: button code conflicts with spam filters and mod_security
|
|
||||||
[!] workarounds if some functions are disabled in php
|
|
||||||
[!] compatibility with PHP 5.3.0
|
|
||||||
[+] new domain: mibew.org
|
|
||||||
|
|
||||||
1.6.2
|
|
||||||
-----
|
|
||||||
[+] bi-licensed: EPL / GPL
|
|
||||||
[+] operator is away status, show status on redirect/survey/operators pages
|
|
||||||
[+] Captcha - Leave Message
|
|
||||||
[+] groups page: last active column
|
|
||||||
[+] pre-chat survey, redirect page: show group status - online/offline/away
|
|
||||||
[!] do not show empty groups in redirect/survey
|
|
||||||
[!] compatibility with the latest mod_security rules
|
|
||||||
[+] performance options in settings: update intervals, operator online time threshold
|
|
||||||
[+] information messages: visitor navigated to ...
|
|
||||||
[!] html code in templates, better appearance in Safari
|
|
||||||
|
|
||||||
1.6.1
|
|
||||||
-----
|
|
||||||
[!] 404 installation problem
|
|
||||||
[+] new permission: "Ability to modify profile"
|
|
||||||
[+] new project name: Mibew Messenger
|
|
||||||
[!] fixed localization of dates for all languages, nice formatting: Today/Yesterday
|
|
||||||
[!] fixed online/offline image for groups
|
|
||||||
[+] ability to delete operators, confirmation dialog when deleting group/operator/blocked address
|
|
||||||
[+] Information about last activity for operators: Online, Today at 22, 01 Jan.., or Never
|
|
||||||
[+] new theme: simplicity (by Sheldmandu)
|
|
||||||
[!] chat templates are fixed according to html standards
|
|
||||||
|
|
||||||
1.6.0
|
|
||||||
-----
|
|
||||||
[+] completely new layout of all administrator pages, XHTML 1.0
|
|
||||||
[+] New awaiting users and chat log pages
|
|
||||||
[+] right menu, show/hide menu on awaiting users page, nice locale chooser
|
|
||||||
[+] main page: warning if database is outdated (after install)
|
|
||||||
[+] "Updates": news, link to the latest version
|
|
||||||
[+] Operator's profile page
|
|
||||||
[+] Configurable pre-chat survey
|
|
||||||
[+] Create/edit/remove groups
|
|
||||||
[+] Canned messages page
|
|
||||||
[+] Statistics page
|
|
||||||
[+] Popup dialog notification of the new visitor (turned off by default)
|
|
||||||
[+] Send message option: enter vs ctrl-enter
|
|
||||||
[!] Slow loading of awating visitors page
|
|
||||||
|
|
||||||
1.5.2
|
|
||||||
-----
|
|
||||||
[+] Ability to disable sound notifications for chat (toolbar button)
|
|
||||||
[+] Switch to SSL in chat (should be enabled in "Settings -> Optional Services")
|
|
||||||
[!] lost query parameters after login redirect
|
|
||||||
[+] added referrer into button code
|
|
||||||
[+] ability to add text for operator into button code, define visitor's name and email
|
|
||||||
[!] geolocation on IPs in history
|
|
||||||
[!] Translation UI: added sorting, filters, fixed several problems
|
|
||||||
[+] New chat buttons
|
|
||||||
|
|
||||||
1.5.1
|
|
||||||
-----
|
|
||||||
[!] significant optimization of chat window (both themes), reduced number of images and their sizes
|
|
||||||
[+] tabs in settings: Optional Services, Themes preview
|
|
||||||
[+] better French and Spanish translations, additional languages are stored separately
|
|
||||||
[+] detect Chrome browser, show its version
|
|
||||||
[!] reverted order in title, removed available_locales variable from config.php (detect automatically)
|
|
||||||
[!] return English message by default (when translation for other language is absent)
|
|
||||||
[!] problems with styles, fixed error messages in avatar uploading
|
|
||||||
[+] nice confirmation when form is saved
|
|
||||||
|
|
||||||
1.5.0
|
|
||||||
-----
|
|
||||||
[!] sound notifications: FF (mac,win), Opera (mac,win), IE, Safari (mac,win)
|
|
||||||
[+] chat styles support: selectors in button generation and in settings
|
|
||||||
[+] styles are applied as set of page templates
|
|
||||||
[+] added styles preview page (the link from settings page) with "fake" chat
|
|
||||||
[+] 2 styles are included: original (old one) and default (new green scheme)
|
|
||||||
[+] new options in settings: user can change name, presentable name pattern
|
|
||||||
[+] customizable geolocation link for IPs on pending users page
|
|
||||||
[+] permissions support: Agents -> some agent -> Permissions
|
|
||||||
[+] New permissions:
|
|
||||||
[x] System administration: settings, operators management, button generation
|
|
||||||
[x] Take over chat thread
|
|
||||||
[x] View another operator's chat thread
|
|
||||||
|
|
||||||
1.4.2
|
|
||||||
-----
|
|
||||||
|
|
||||||
[+] Operators photos (appears in users chat window)
|
|
||||||
[+] pending users: show first user message (below the name)
|
|
||||||
[+] pending users: show visitors's browser name and version
|
|
||||||
[+] mark user with unique id to be able to see its dialogs later
|
|
||||||
[+] special button in operator's thread to browse previous chats
|
|
||||||
[+] Spam Blocking
|
|
||||||
|
|
||||||
1.4.1
|
|
||||||
-----
|
|
||||||
|
|
||||||
[+] redirect visitor to another operator
|
|
||||||
[+] predefined answers (without proper management yet)
|
|
||||||
[+] play notification sounds (new message, new visitor)
|
|
||||||
[+] confirmation when trying to intercept another operator's visitor
|
|
||||||
[+] ability to view threads without taking
|
|
||||||
|
|
||||||
1.4.0
|
|
||||||
-----
|
|
||||||
|
|
||||||
[+] introduce messenger settings page, persist several options in DB instead of config.php
|
|
||||||
[+] improve history search speed
|
|
||||||
[+] do not show typing notification for disconnected remote
|
|
||||||
[!] monitor connection status, show reconnecing message when connection is low (pendings users and chat window)
|
|
||||||
[!] support lang & language args in button code, create correct code for link
|
|
||||||
[!] fix safari, opera 9.5+ (+ several others compatibility fixes)
|
|
||||||
|
|
||||||
1.0.10
|
|
||||||
------
|
|
||||||
|
|
||||||
[+] Number of messages from visitor in history
|
|
||||||
[+] State "loading" (means user is still loading his window)
|
|
||||||
[+] Timers on peding users page are ticking now
|
|
||||||
[!] Company logo link target is now an option in config
|
|
||||||
[!] Mail encoding fixed (separate option)
|
|
||||||
[!] Operator/user locale is stored in cookie
|
|
||||||
[!] localized dates
|
|
||||||
[!] fixed installing on DB with numeric name
|
|
||||||
[!] empty and double messages
|
|
||||||
[!] #1983764
|
|
||||||
|
|
||||||
1.0.9
|
|
||||||
-----
|
|
||||||
|
|
||||||
[+] typing notifications in chat window
|
|
||||||
[!] completly new encoding handling, default is utf-8, page encoding is set in resources
|
|
||||||
[!] fixed user name storage in cookie (now utf8 in base64)
|
|
||||||
[!] some fixes for Opera
|
|
||||||
[!] force utf-8 for xml
|
|
||||||
|
|
||||||
1.0.8
|
|
||||||
-----
|
|
||||||
|
|
||||||
[+] install/update wizard, can create database and update it if needed
|
|
||||||
[+] leave message form when no operator is available
|
|
||||||
[!] location of web application can be other than /webim (see config.php)
|
|
||||||
[!] locale-specific resources extracted into /locales
|
|
||||||
[!] some fixes for Safari browser
|
|
||||||
[!] email validation in forms
|
|
||||||
|
|
||||||
1.0.7
|
|
||||||
-----
|
|
||||||
|
|
||||||
[+] history search with pagination
|
|
||||||
[+] advanced button generation: secure link, include hostname, choosing images
|
|
||||||
[+] post referer into thread as a message (visible only for agent)
|
|
||||||
[+] new config options: user can change name, company name, logo
|
|
||||||
[+] notify operator if user closed his window
|
|
||||||
[+] notify visitor if operator has connection problems and move it into priority queue
|
|
||||||
[+] automatically take visitor if operator connection restored
|
|
||||||
[!] encoding problems in Internet Explorer
|
|
||||||
[!] quotes in messages & user names
|
|
||||||
[!] do not reopen closed threads
|
|
||||||
[!] some fixes in handling thread locale
|
|
||||||
[!] version in menu, locales chooser in menu
|
|
||||||
|
|
@ -1 +0,0 @@
|
|||||||
var myAgent="",myVer=0,myRealAgent="";function detectAgent(){for(var a="opera msie safari firefox netscape mozilla".split(" "),b=navigator.userAgent.toLowerCase(),c=0;c<a.length;c++){var d=a[c];if(-1!=b.indexOf(d)){myAgent=d;if(!window.RegExp)break;null!=RegExp(d+"[ /]?([0-9]+(.[0-9]+)?)").exec(b)&&(myVer=parseFloat(RegExp.$1));break}}myRealAgent=myAgent;"Gecko"==navigator.product&&(myAgent="moz")}detectAgent();function getEl(a){return document.getElementById(a)};
|
|
@ -1,24 +0,0 @@
|
|||||||
/*
|
|
||||||
This file is part of Mibew Messenger project.
|
|
||||||
http://mibew.org
|
|
||||||
|
|
||||||
Copyright (c) 2005-2014 Mibew Messenger Community
|
|
||||||
License: http://mibew.org/license.php
|
|
||||||
*/
|
|
||||||
var FrameUtils={getDocument:function(a){return a.contentDocument?a.contentDocument:a.contentWindow?a.contentWindow.document:a.document?a.document:null},initFrame:function(a){var b=this.getDocument(a);b.open();b.write("<html><head>");b.write('<link rel="stylesheet" type="text/css" media="all" href="'+Chat.cssfile+'">');b.write('</head><body bgcolor="#FFFFFF" text=#000000" link="#C28400" vlink="#C28400" alink="#C28400">');b.write('<table width="100%" cellspacing="0" cellpadding="0" border="0"><tr><td valign="top" class="message" id="content"></td></tr></table><a id="bottom" name="bottom"></a>');
|
|
||||||
b.write("</body></html>");b.close();a.onload=function(){a.myHtml&&(FrameUtils.getDocument(a).getElementById("content").innerHTML+=a.myHtml,FrameUtils.scrollDown(a))}},insertIntoFrame:function(a,b){var c=this.getDocument(a).getElementById("content");null==c?(a.myHtml||(a.myHtml=""),a.myHtml+=b):c.innerHTML+=b},scrollDown:function(a){var b=this.getDocument(a).getElementById("bottom");if("opera"==myAgent)try{a.contentWindow.scrollTo(0,this.getDocument(a).getElementById("content").clientHeight)}catch(c){}b&&
|
|
||||||
b.scrollIntoView(!1)}};Ajax.ChatThreadUpdater=Class.create();
|
|
||||||
Class.inherit(Ajax.ChatThreadUpdater,Ajax.Base,{initialize:function(a){this.setOptions(a);this._options.onComplete=this.requestComplete.bind(this);this._options.onException=this.handleException.bind(this);this._options.onTimeout=this.handleTimeout.bind(this);this._options.timeout=5E3;this.updater={};this.frequency=this._options.frequency||2;this.lastupdate=0;this.focused=this.skipNextsound=this.cansend=!0;this.ownThread=null!=this._options.message;FrameUtils.initFrame(this._options.container);this._options.message&&
|
|
||||||
(this._options.message.onkeydown=this.handleKeyDown.bind(this),this._options.message.onfocus=function(){this.focused=!0}.bind(this),this._options.message.onblur=function(){this.focused=!1}.bind(this));this.update()},handleException:function(a,b){this.setStatus("offline, reconnecting");this.stopUpdate();this.timer=setTimeout(this.update.bind(this),1E3)},handleTimeout:function(a){this.setStatus("timeout, reconnecting");this.stopUpdate();this.timer=setTimeout(this.update.bind(this),1E3)},updateOptions:function(a){this._options.parameters=
|
|
||||||
"act="+a+"&thread="+(this._options.threadid||0)+"&token="+(this._options.token||0)+"&lastid="+(this._options.lastid||0);this._options.user&&(this._options.parameters+="&user=true");"refresh"==a&&this._options.message&&""!=this._options.message.value&&(this._options.parameters+="&typed=1")},enableInput:function(a){this._options.message&&(this._options.message.disabled=!a)},stopUpdate:function(){this.enableInput(!0);this.updater._options&&(this.updater._options.onComplete=void 0);clearTimeout(this.timer)},
|
|
||||||
update:function(){this.updateOptions("refresh");this.updater=new Ajax.Request(this._options.servl,this._options)},requestComplete:function(a){try{this.enableInput(!0);this.cansend=!0;var b=Ajax.getXml(a);b&&"thread"==b.tagName?this.updateContent(b):this.handleError(a,b,"refresh messages failed")}catch(c){}this.skipNextsound=!1;this.timer=setTimeout(this.update.bind(this),1E3*this.frequency)},postMessage:function(a){if(""!=a&&this.cansend){this.cansend=!1;this.stopUpdate();this.skipNextsound=!0;this.updateOptions("post");
|
|
||||||
var b={}.extend(this._options);b.parameters+="&message="+encodeURIComponent(a);b.onComplete=function(a){this.requestComplete(a);this._options.message&&(this._options.message.value="",this._options.message.focus())}.bind(this);"opera"!=myRealAgent&&this.enableInput(!1);this.updater=new Ajax.Request(this._options.servl,b)}},changeName:function(a){this.skipNextsound=!0;new Ajax.Request(this._options.servl,{parameters:"act=rename&thread="+(this._options.threadid||0)+"&token="+(this._options.token||0)+
|
|
||||||
"&name="+encodeURIComponent(a)})},onThreadClosed:function(a){var b=Ajax.getXml(a);b&&"closed"==b.tagName?setTimeout("window.close()",2E3):this.handleError(a,b,"cannot close")},closeThread:function(){var a="act=close&thread="+(this._options.threadid||0)+"&token="+(this._options.token||0);this._options.user&&(a+="&user=true");new Ajax.Request(this._options.servl,{parameters:a,onComplete:this.onThreadClosed.bind(this)})},processMessage:function(a,b){var c=NodeUtils.getNodeText(b);FrameUtils.insertIntoFrame(a,
|
|
||||||
c)},showTyping:function(a){$("typingdiv")&&($("typingdiv").style.display=a?"inline":"none")},setupAvatar:function(a){a=NodeUtils.getNodeText(a);this._options.avatar&&this._options.user&&(this._options.avatar.innerHTML=""!=a?'<img src="'+Chat.mibewRoot+'/images/free.gif" width="7" height="1" border="0" alt="" /><img src="'+a+'" border="0" alt=""/>':"")},updateContent:function(a){var b=!1,c=this._options.container,d=NodeUtils.getAttrValue(a,"lastid");d&&(this._options.lastid=d);(d=NodeUtils.getAttrValue(a,
|
|
||||||
"typing"))&&this.showTyping("1"==d);(d=NodeUtils.getAttrValue(a,"canpost"))&&("1"==d&&!this.ownThread||this.ownThread&&"1"!=d)&&(window.location.href=window.location.href);for(d=0;d<a.childNodes.length;d++){var e=a.childNodes[d];"message"==e.tagName?(b=!0,this.processMessage(c,e)):"avatar"==e.tagName&&this.setupAvatar(e)}0<=window.location.search.indexOf("trace=on")?(a="updated",0<this.lastupdate&&(c=((new Date).getTime()-this.lastupdate)/1E3,a=a+", "+c+" secs",10<c&&alert(a)),this.lastupdate=(new Date).getTime(),
|
|
||||||
this.setStatus(a)):this.clearStatus();b&&(FrameUtils.scrollDown(this._options.container),this.skipNextsound||(b=$("soundimg"),(null==b||b.className.match(/\bisound\b/))&&playSound(Chat.mibewRoot+"/sounds/new_message.wav")),this.focused||window.focus())},isSendkey:function(a,b){return 13==b&&(a||this._options.ignorectrl)||10==b},handleKeyDown:function(a){a?(ctrl=a.ctrlKey,a=a.which):(a=event.keyCode,ctrl=event.ctrlKey);return this._options.message&&this.isSendkey(ctrl,a)?(a=this._options.message.value,
|
|
||||||
this._options.ignorectrl&&(a=a.replace(/[\r\n]+$/,"")),this.postMessage(a),!1):!0},handleError:function(a,b,c){b&&"error"==b.tagName?this.setStatus(NodeUtils.getNodeValue(b,"descr")):this.setStatus("reconnecting")},showStatusDiv:function(a){$("engineinfo")&&($("engineinfo").style.display="inline",$("engineinfo").innerHTML=a)},setStatus:function(a){this.statusTimeout&&clearTimeout(this.statusTimeout);this.showStatusDiv(a);this.statusTimeout=setTimeout(this.clearStatus.bind(this),4E3)},clearStatus:function(){$("engineinfo").style.display=
|
|
||||||
"none"}});var Chat={threadUpdater:{},applyName:function(){$("uname").value.match(/^\s*$/)||(Chat.threadUpdater.changeName($("uname").value),$("changename1").style.display="none",$("changename2").style.display="inline",$("unamelink").innerHTML=htmlescape($("uname").value))},showNameField:function(){$("changename1").style.display="inline";$("changename2").style.display="none"}};
|
|
||||||
Behaviour.register({"#postmessage a":function(a){a.onclick=function(){var a=$("msgwnd");a&&Chat.threadUpdater.postMessage(a.value)}},"select#predefined":function(a){a.onchange=function(){var a=$("msgwnd");0!=this.selectedIndex&&(a.value=this.options[this.selectedIndex].innerText||this.options[this.selectedIndex].innerHTML);this.selectedIndex=0;a.focus()}},"div#changename2 a":function(a){a.onclick=function(){Chat.showNameField();return!1}},"div#changename1 a":function(a){a.onclick=function(){Chat.applyName();
|
|
||||||
return!1}},"div#changename1 input#uname":function(a){a.onkeydown=function(a){13==(a||event).keyCode&&Chat.applyName()}},"a#refresh":function(a){a.onclick=function(){Chat.threadUpdater.stopUpdate();Chat.threadUpdater.update()}},"a#togglesound":function(a){a.onclick=function(){var a=$("soundimg");a&&(a.className.match(/\bisound\b/)?a.className="tplimage inosound":a.className="tplimage isound",(a=$("msgwnd"))&&a.focus())}},"a.closethread":function(a){a.onclick=function(){Chat.threadUpdater.closeThread()}}});
|
|
||||||
EventHelper.register(window,"onload",function(){Chat.mibewRoot=threadParams.wroot;Chat.cssfile=threadParams.cssfile;Chat.threadUpdater=new Ajax.ChatThreadUpdater({ignorectrl:-1,container:"safari"==myRealAgent?self.frames[0]:$("chatwnd"),avatar:$("avatarwnd"),message:$("msgwnd")}.extend(threadParams||{}))});
|
|
@ -1,25 +0,0 @@
|
|||||||
/*
|
|
||||||
This file is part of Mibew Messenger project.
|
|
||||||
http://mibew.org
|
|
||||||
|
|
||||||
Copyright (c) 2005-2014 Mibew Messenger Community
|
|
||||||
License: http://mibew.org/license.php
|
|
||||||
*/
|
|
||||||
var Class={create:function(){return function(){this.initialize.apply(this,arguments)}},inherit:function(a,b,c){Object.extend(Object.extend(a.prototype,b.prototype),c)}};Object.extend=function(a,b){for(property in b)a[property]=b[property];return a};Object.prototype.extend=function(a){return Object.extend.apply(this,[this,a])};Function.prototype.bind=function(a){var b=this;return function(){return b.apply(a,arguments)}};
|
|
||||||
Function.prototype.bindAsEventListener=function(a){var b=this;return function(c){b.call(a,c||window.event)}};Number.prototype.toColorPart=function(){var a=this.toString(16);return 16>this?"0"+a:a};var Try={these:function(){for(var a,b=0;b<arguments.length;b++){var c=arguments[b];try{a=c();break}catch(d){}}return a}},PeriodicalExecuter=Class.create();
|
|
||||||
PeriodicalExecuter.prototype={initialize:function(a,b){this.callback=a;this.frequency=b;this.currentlyExecuting=!1;this.registerCallback()},registerCallback:function(){setInterval(this.onTimerEvent.bind(this),1E3*this.frequency)},onTimerEvent:function(){if(!this.currentlyExecuting)try{this.currentlyExecuting=!0,this.callback()}finally{this.currentlyExecuting=!1}}};
|
|
||||||
function findObj(a){var b;!(b=document[a])&&document.all&&(b=document.all[a]);!b&&document.getElementById&&(b=document.getElementById(a));if(!b&&!document.all&&document.getElementsByName){b=document.getElementsByName(a);if(0==b.length)return null;if(1==b.length)return b[0]}return b}Array.prototype.push||(Array.prototype.push=function(){for(var a=this.length,b=0;b<arguments.length;b++)this[a+b]=arguments[b];return this.length});
|
|
||||||
function $(){for(var a=[],b=0;b<arguments.length;b++){var c=arguments[b];"string"==typeof c&&(c=findObj(c));if(1==arguments.length)return c;a.push(c)}return a}
|
|
||||||
var Ajax={getTransport:function(){return Try.these(function(){return new ActiveXObject("Msxml2.XMLHTTP")},function(){return new ActiveXObject("Microsoft.XMLHTTP")},function(){return new XMLHttpRequest})||!1},getXml:function(a){return a&&200<=a.status&&300>a.status&&(a=a.responseXML)&&a.documentElement?a.documentElement:null},getError:function(a){return a.statusText||"connection error N"+a.status},emptyFunction:function(){},Base:function(){}};
|
|
||||||
Ajax.Base.prototype={setOptions:function(a){this._options={_method:"post",asynchronous:!0,parameters:""}.extend(a||{})},getStatus:function(){try{return this.transport.status||0}catch(a){return 0}},responseIsSuccess:function(){var a=this.getStatus();return!a||200<=a&&300>a},responseIsFailure:function(){return!this.responseIsSuccess()}};Ajax.Request=Class.create();Ajax.Request.Events=["Uninitialized","Loading","Loaded","Interactive","Complete"];
|
|
||||||
Class.inherit(Ajax.Request,Ajax.Base,{initialize:function(a,b){this.transport=Ajax.getTransport();this.setOptions(b);this.transportTimer={};this.finished=!1;this.request(a)},request:function(a){var b=this._options.parameters||"";0<b.length&&(b+="&_=");try{"get"==this._options._method&&0<b.length&&(a+="?"+b);this.transport.open(this._options._method.toUpperCase(),a,this._options.asynchronous);this._options.asynchronous&&(this.transport.onreadystatechange=this.onStateChange.bind(this),this._options.timeout&&
|
|
||||||
(this.transportTimer=setTimeout(this.handleTimeout.bind(this),this._options.timeout)));this.setRequestHeaders();var c=this._options.postBody?this._options.postBody:b;this.transport.send("post"==this._options._method?c:null)}catch(d){this.dispatchException(d)}},setRequestHeaders:function(){var a=["X-Requested-With","XMLHttpRequest"];"post"==this._options._method&&(a.push("Content-type","application/x-www-form-urlencoded"),this.transport.overrideMimeType&&2005>(navigator.userAgent.match("/Gecko/(d{4})/")||
|
|
||||||
[0,2005])[1]&&a.push("Connection","close"));this._options.requestHeaders&&a.push.apply(a,this._options.requestHeaders);for(var b=0;b<a.length;b+=2)this.transport.setRequestHeader(a[b],a[b+1])},onStateChange:function(){1!=this.transport.readyState&&this.respondToReadyState(this.transport.readyState)},handleTimeout:function(){this.finished||(this.finished=!0,(this._options.onTimeout||Ajax.emptyFunction)(this))},respondToReadyState:function(a){if("Complete"==Ajax.Request.Events[a]){try{this.finished||
|
|
||||||
(this.finished=!0,this._options.timeout&&clearTimeout(this.transportTimer),(this._options.onComplete||Ajax.emptyFunction)(this.transport))}catch(b){this.dispatchException(b)}this.transport.onreadystatechange=Ajax.emptyFunction}},dispatchException:function(a){(this._options.onException||Ajax.emptyFunction)(this,a)}});
|
|
||||||
var EventHelper={register:function(a,b,c){var d=a[b];a[b]="function"!=typeof d?c:function(){d();c()}}},Behaviour={list:[],register:function(a){Behaviour.list.push(a)},init:function(){EventHelper.register(window,"onload",function(){Behaviour.apply()})},apply:function(){for(h=0;sheet=Behaviour.list[h];h++)for(selector in sheet)if(list=document.getElementsBySelector(selector))for(i=0;element=list[i];i++)sheet[selector](element)}};Behaviour.init();
|
|
||||||
function getAllChildren(a){return a.all?a.all:a.getElementsByTagName("*")}
|
|
||||||
document.getElementsBySelector=function(a){if(!document.getElementsByTagName)return[];a=a.split(" ");for(var b=Array(document),c=0;c<a.length;c++)if(token=a[c].replace(/^\s+/,"").replace(/\s+$/,""),-1<token.indexOf("#")){var d=token.split("#"),e=d[0],b=document.getElementById(d[1]);if(null==b||e&&b.nodeName.toLowerCase()!=e)return[];b=Array(b)}else if(-1<token.indexOf(".")){d=token.split(".");e=d[0];d=d[1];e||(e="*");for(var m=[],l=0,p=0;p<b.length;p++){var f;f="*"==e?getAllChildren(b[p]):b[p].getElementsByTagName(e);
|
|
||||||
if(null!=f)for(var q=0;q<f.length;q++)m[l++]=f[q]}b=[];for(l=e=0;l<m.length;l++)m[l].className&&m[l].className.match(RegExp("\\b"+d+"\\b"))&&(b[e++]=m[l])}else{if(!b[0])return;e=token;m=[];for(p=l=0;p<b.length;p++)for(f=b[p].getElementsByTagName(e),q=0;q<f.length;q++)m[l++]=f[q];b=m}return b};
|
|
||||||
var NodeUtils={getNodeValue:function(a,b){var c=a.getElementsByTagName(b);if(0==c.length)return"";var c=c[0].childNodes,d="";for(i=0;i<c.length;i++)d+=c[i].nodeValue;return d},getNodeText:function(a){a=a.childNodes;var b="";for(i=0;i<a.length;i++)b+=a[i].nodeValue;return b},getAttrValue:function(a,b){for(k=0;k<a.attributes.length;k++)if(a.attributes[k].nodeName==b)return a.attributes[k].nodeValue;return null}},CommonUtils={getRow:function(a,b){var c=b.rows[a];if(null!=c)return c;if(null!=b.rows.head)return null;
|
|
||||||
for(k=0;k<b.rows.length;k++)if(b.rows[k].id==a)return b.rows[k];return null},getCell:function(a,b,c){var d=b.cells[a];if(null!=d)return d;if(null!=c.rows.head)return null;for(k=0;k<b.cells.length;k++)if(b.cells[k].id==a)return b.cells[k];return null},insertCell:function(a,b,c,d,e,m){a=a.insertCell(-1);a.id=b;d&&(a.align=d);a.className=c;e&&(a.height=e);a.innerHTML=m}};
|
|
||||||
function playSound(a){var b=document.createElement("div");-1!=navigator.userAgent.toLowerCase().indexOf("opera")&&(b.style="position: absolute; left: 0px; top: -200px;");document.body.appendChild(b);b.innerHTML='<audio autoplay src="'+a+'"><embed src="'+a+'" hidden="true" autostart="true" loop="false"></audio>'}function htmlescape(a){return a.replace("&","&").replace("<","<").replace(">",">").replace('"',""")};
|
|
@ -1,11 +0,0 @@
|
|||||||
window.attachEvent('onload', mkwidth);
|
|
||||||
window.attachEvent('onresize', mkwidth);
|
|
||||||
|
|
||||||
function mkwidth(){
|
|
||||||
if(document.getElementById("wrap700")) {
|
|
||||||
document.getElementById("wrap700").style.width = document.documentElement.clientWidth < 750 ? "750px" : "100%";
|
|
||||||
}
|
|
||||||
if(document.getElementById("wrap400")) {
|
|
||||||
document.getElementById("wrap400").style.width = document.documentElement.clientWidth < 450 ? "450px" : "100%";
|
|
||||||
}
|
|
||||||
};
|
|
@ -1,61 +0,0 @@
|
|||||||
var popupStatus = 0;
|
|
||||||
|
|
||||||
function loadPopup(){
|
|
||||||
if(popupStatus==0){
|
|
||||||
$("#backgroundPopup").css({
|
|
||||||
"opacity": "0.7"
|
|
||||||
});
|
|
||||||
$("#backgroundPopup").fadeIn("slow");
|
|
||||||
$("#dashlocalesPopup").fadeIn("slow");
|
|
||||||
popupStatus = 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
function disablePopup(){
|
|
||||||
if(popupStatus==1){
|
|
||||||
$("#backgroundPopup").fadeOut("slow");
|
|
||||||
$("#dashlocalesPopup").fadeOut("slow");
|
|
||||||
popupStatus = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function normpos(a) {
|
|
||||||
if(a < 10) {
|
|
||||||
return 10;
|
|
||||||
}
|
|
||||||
return a;
|
|
||||||
}
|
|
||||||
|
|
||||||
function centerPopup(){
|
|
||||||
var windowWidth = document.documentElement.clientWidth;
|
|
||||||
var windowHeight = document.documentElement.clientHeight;
|
|
||||||
var popupHeight = $("#dashlocalesPopup").height();
|
|
||||||
var popupWidth = $("#dashlocalesPopup").width();
|
|
||||||
$("#dashlocalesPopup").css({
|
|
||||||
"position": "absolute",
|
|
||||||
"top": normpos((windowHeight-popupHeight) * 0.2),
|
|
||||||
"left": normpos(windowWidth/2-popupWidth/2)
|
|
||||||
});
|
|
||||||
$("#backgroundPopup").css({
|
|
||||||
"height": windowHeight
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
$(function(){
|
|
||||||
$("#changelang").click(function(){
|
|
||||||
centerPopup();
|
|
||||||
loadPopup();
|
|
||||||
return false;
|
|
||||||
});
|
|
||||||
$("#dashlocalesPopupClose").click(function(){
|
|
||||||
disablePopup();
|
|
||||||
return false;
|
|
||||||
});
|
|
||||||
$("#backgroundPopup").click(function(){
|
|
||||||
disablePopup();
|
|
||||||
});
|
|
||||||
$(document).keypress(function(e){
|
|
||||||
if(e.keyCode==27 && popupStatus==1){
|
|
||||||
disablePopup();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
});
|
|
@ -1 +0,0 @@
|
|||||||
Behaviour.register({"a#check-nv":function(a){a.onclick=function(){playSound(wroot+"/sounds/new_user.wav")}},"a#check-nm":function(a){a.onclick=function(){playSound(wroot+"/sounds/new_message.wav")}}});
|
|
@ -1,33 +0,0 @@
|
|||||||
function loadNews() {
|
|
||||||
if (typeof(window.mibewNews) == "undefined" || typeof(window.mibewNews.length) == "undefined")
|
|
||||||
return;
|
|
||||||
|
|
||||||
var str = "<div>";
|
|
||||||
for (var i = 0; i < window.mibewNews.length; i++) {
|
|
||||||
str += "<div class=\"newstitle\"><a hre" + "f=\"" + window.mibewNews[i].link + "\">" + window.mibewNews[i].title + "</a>, <span class=\"small\">" + window.mibewNews[i].date + "</span></div>";
|
|
||||||
str += "<div class=\"newstext\">" + window.mibewNews[i].message+"</div>";
|
|
||||||
}
|
|
||||||
$("#news").html(str + "</div>");
|
|
||||||
}
|
|
||||||
|
|
||||||
function loadVersion() {
|
|
||||||
if(typeof(window.mibewLatest) == "undefined" || typeof(window.mibewLatest.version) == "undefined")
|
|
||||||
return;
|
|
||||||
|
|
||||||
var current = $("#cver").html();
|
|
||||||
|
|
||||||
if(current != window.mibewLatest.version) {
|
|
||||||
if(current < window.mibewLatest.version) {
|
|
||||||
$("#cver").css("color","red");
|
|
||||||
}
|
|
||||||
$("#lver").html(window.mibewLatest.version+", Download <a href=\""+window.mibewLatest.download+"\">"+window.mibewLatest.title+"</a>");
|
|
||||||
} else {
|
|
||||||
$("#cver").css("color","green");
|
|
||||||
$("#lver").html(window.mibewLatest.version);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$(function(){
|
|
||||||
loadNews();
|
|
||||||
loadVersion();
|
|
||||||
});
|
|
@ -1,27 +0,0 @@
|
|||||||
/*
|
|
||||||
This file is part of Mibew Messenger project.
|
|
||||||
http://mibew.org
|
|
||||||
|
|
||||||
Copyright (c) 2005-2014 Mibew Messenger Community
|
|
||||||
License: http://mibew.org/license.php
|
|
||||||
*/
|
|
||||||
Ajax.PeriodicalUpdater=Class.create();
|
|
||||||
Class.inherit(Ajax.PeriodicalUpdater,Ajax.Base,{initialize:function(a){this.setOptions(a);this._options.onComplete=this.requestComplete.bind(this);this._options.onException=this.handleException.bind(this);this._options.onTimeout=this.handleTimeout.bind(this);this._options.timeout=5E3;this.frequency=this._options.frequency||2;this.updater={};this.update()},handleException:function(a,b){this._options.handleError&&this._options.handleError("offline, reconnecting");this.stopUpdate();this.timer=setTimeout(this.update.bind(this),
|
|
||||||
1E3)},handleTimeout:function(a){this._options.handleError&&this._options.handleError("timeout, reconnecting");this.stopUpdate();this.timer=setTimeout(this.update.bind(this),1E3)},stopUpdate:function(){this.updater._options&&(this.updater._options.onComplete=void 0);clearTimeout(this.timer)},update:function(){this._options.updateParams&&(this._options.parameters=this._options.updateParams());this.updater=new Ajax.Request(this._options.url,this._options)},requestComplete:function(a){try{var b=Ajax.getXml(a);
|
|
||||||
b?(this._options.updateContent||Ajax.emptyFunction)(b):this._options.handleError&&this._options.handleError("reconnecting")}catch(c){}this.timer=setTimeout(this.update.bind(this),1E3*this.frequency)}});
|
|
||||||
var HtmlGenerationUtils={popupLink:function(a,b,c,d,e,m,l){return'<a href="'+a+'"'+(null!=l?' class="'+l+'"':"")+' target="_blank" title="'+b+'" onclick="this.newWindow = window.open(\''+a+"', '"+c+"', 'toolbar=0,scrollbars=0,location=0,status=1,menubar=0,width="+e+",height="+m+",resizable=1');this.newWindow.focus();this.newWindow.opener=window;return false;\">"+d+"</a>"},generateOneRowTable:function(a){return'<table class="inner"><tr>'+a+"</tr></table>"},viewOpenCell:function(a,b,c,d,e,m,l,p){m=
|
|
||||||
2;b=b+"?thread="+c;var f="<td>",f=e||d?f+HtmlGenerationUtils.popupLink(p||!d?b:b+"&viewonly=true",localized[e?0:1],"ImCenter"+c,a,640,480,null):f+('<a href="#">'+a+"</a>"),f=f+"</td>";e&&(f=f+'<td class="icon">'+HtmlGenerationUtils.popupLink(b,localized[0],"ImCenter"+c,'<img src="'+mibewRoot+'/images/tbliclspeak.gif" width="15" height="15" border="0" alt="'+localized[0]+'">',640,480,null),f+="</td>",m++);d&&(f+='<td class="icon">',f+=HtmlGenerationUtils.popupLink(b+"&viewonly=true",localized[1],"ImCenter"+
|
|
||||||
c,'<img src="'+mibewRoot+'/images/tbliclread.gif" width="15" height="15" border="0" alt="'+localized[1]+'">',640,480,null),f+="</td>",m++);""!=l&&(f+='</tr><tr><td class="firstmessage" colspan="'+m+'"><a href="javascript:void(0)" title="'+l+'" onclick="alert(this.title);return false;">',f+=30<l.length?l.substring(0,30)+"...":l,f+="</a></td>");return HtmlGenerationUtils.generateOneRowTable(f)},banCell:function(a,b){return'<td class="icon">'+HtmlGenerationUtils.popupLink(mibewRoot+"/operator/ban.php?"+
|
|
||||||
(b?"id="+b:"thread="+a),localized[2],"ban"+a,'<img src="'+mibewRoot+'/images/ban.gif" width="15" height="15" border="0" alt="'+localized[2]+'">',720,480,null)+"</td>"}};Ajax.ThreadListUpdater=Class.create();
|
|
||||||
Class.inherit(Ajax.ThreadListUpdater,Ajax.Base,{initialize:function(a){this.setOptions(a);this._options.updateParams=this.updateParams.bind(this);this._options.handleError=this.handleError.bind(this);this._options.updateContent=this.updateContent.bind(this);this._options.lastrevision=0;this.threadTimers={};this.delta=0;this.t=this._options.table;this.periodicalUpdater=new Ajax.PeriodicalUpdater(this._options)},updateParams:function(){return"since="+this._options.lastrevision+"&status="+this._options.istatus+
|
|
||||||
(this._options.showonline?"&showonline=1":"")},setStatus:function(a){this._options.status.innerHTML=a},handleError:function(a){this.setStatus(a)},updateThread:function(a){function b(a,b,c,d){if(a=CommonUtils.getCell(c,b,a))a.innerHTML=d}for(var c,d,e,m=!1,l=!1,p=!1,f=null,q=null,g=0;g<a.attributes.length;g++){var n=a.attributes[g];"id"==n.nodeName?c=n.nodeValue:"stateid"==n.nodeName?d=n.nodeValue:"state"==n.nodeName?e=n.nodeValue:"canopen"==n.nodeName?l=!0:"canview"==n.nodeName?m=!0:"canban"==n.nodeName?
|
|
||||||
p=!0:"ban"==n.nodeName?f=n.nodeValue:"banid"==n.nodeName&&(q=n.nodeValue)}g=CommonUtils.getRow("thr"+c,this.t);if("closed"==d)g&&this.t.deleteRow(g.rowIndex),this.threadTimers[c]=null;else{var n=NodeUtils.getNodeValue(a,"name"),u=NodeUtils.getNodeValue(a,"addr"),s=NodeUtils.getNodeValue(a,"time"),v=NodeUtils.getNodeValue(a,"agent"),t=NodeUtils.getNodeValue(a,"modified"),w=NodeUtils.getNodeValue(a,"message"),r="<td>"+NodeUtils.getNodeValue(a,"useragent")+"</td>";null!=f&&(r="<td>"+NodeUtils.getNodeValue(a,
|
|
||||||
"reason")+"</td>");p&&(r+=HtmlGenerationUtils.banCell(c,q));r=HtmlGenerationUtils.generateOneRowTable(r);a=CommonUtils.getRow("t"+d,this.t);p=CommonUtils.getRow("t"+d+"end",this.t);null!=g&&(g.rowIndex<=a.rowIndex||g.rowIndex>=p.rowIndex)&&(this.t.deleteRow(g.rowIndex),g=this.threadTimers[c]=null);if(null==g){if(g=this.t.insertRow(a.rowIndex+1),g.className="blocked"==f&&"chat"!=d?"ban":"in"+d,g.id="thr"+c,this.threadTimers[c]=[s,t,d],CommonUtils.insertCell(g,"name","visitor",null,null,HtmlGenerationUtils.viewOpenCell(n,
|
|
||||||
this._options.agentservl,c,m,l,f,w,"chat"!=d)),CommonUtils.insertCell(g,"contid","visitor","center",null,u),CommonUtils.insertCell(g,"state","visitor","center",null,e),CommonUtils.insertCell(g,"op","visitor","center",null,v),CommonUtils.insertCell(g,"time","visitor","center",null,this.getTimeSince(s)),CommonUtils.insertCell(g,"wait","visitor","center",null,"chat"!=d?this.getTimeSince(t):"-"),CommonUtils.insertCell(g,"etc","visitor","center",null,r),"wait"==d||"prio"==d)return!0}else this.threadTimers[c]=
|
|
||||||
[s,t,d],g.className="blocked"==f&&"chat"!=d?"ban":"in"+d,b(this.t,g,"name",HtmlGenerationUtils.viewOpenCell(n,this._options.agentservl,c,m,l,f,w,"chat"!=d)),b(this.t,g,"contid",u),b(this.t,g,"state",e),b(this.t,g,"op",v),b(this.t,g,"time",this.getTimeSince(s)),b(this.t,g,"wait","chat"!=d?this.getTimeSince(t):"-"),b(this.t,g,"etc",r);return!1}},updateQueueMessages:function(){function a(a,b){var c=$(b),l=$(b+"end");return null==c||null==l?!1:c.rowIndex+1<l.rowIndex}var b=$("statustd");if(b){var c=a(this.t,
|
|
||||||
"twait")||a(this.t,"tprio")||a(this.t,"tchat");b.innerHTML=c?"":this._options.noclients;b.height=c?5:30}},getTimeSince:function(a){a=Math.floor(((new Date).getTime()-a-this.delta)/1E3);var b=Math.floor(a/60),c="";a%=60;10>a&&(a="0"+a);60<=b&&(c=Math.floor(b/60),b%=60,10>b&&(b="0"+b),c+=":");return c+b+":"+a},updateTimers:function(){for(var a in this.threadTimers)if(null!=this.threadTimers[a]){var b=this.threadTimers[a],c=CommonUtils.getRow("thr"+a,this.t);if(null!=c){var d=this.getTimeSince(b[0]),
|
|
||||||
e=CommonUtils.getCell("time",c,this.t);e&&(e.innerHTML=d);b="chat"!=b[2]?this.getTimeSince(b[1]):"-";if(c=CommonUtils.getCell("wait",c,this.t))c.innerHTML=b}}},updateThreads:function(a){var b=!1,c=NodeUtils.getAttrValue(a,"time"),d=NodeUtils.getAttrValue(a,"revision");c&&(this.delta=(new Date).getTime()-c);d&&(this._options.lastrevision=d);for(c=0;c<a.childNodes.length;c++)d=a.childNodes[c],"thread"==d.tagName&&this.updateThread(d)&&(b=!0);this.updateQueueMessages();this.updateTimers();this.setStatus(this._options.istatus?
|
|
||||||
"Away":"Up to date");b&&(playSound(mibewRoot+"/sounds/new_user.wav"),window.focus(),updaterOptions.showpopup&&alert(localized[5]))},updateOperators:function(a){var b=$("onlineoperators");if(b){for(var c=[],d=0;d<a.childNodes.length;d++){var e=a.childNodes[d];if("operator"==e.tagName){var m=NodeUtils.getAttrValue(e,"name"),e=null!=NodeUtils.getAttrValue(e,"away");c[c.length]='<img src="'+mibewRoot+"/images/op"+(e?"away":"online")+'.gif" width="12" height="12" border="0" alt="'+localized[1]+'"> '+m}}b.innerHTML=
|
|
||||||
c.join(", ")}},updateContent:function(a){if("update"==a.tagName)for(var b=0;b<a.childNodes.length;b++){var c=a.childNodes[b];"threads"==c.tagName?this.updateThreads(c):"operators"==c.tagName&&this.updateOperators(c)}else"error"==a.tagName?this.setStatus(NodeUtils.getNodeValue(a,"descr")):this.setStatus("reconnecting")}});
|
|
||||||
function togglemenu(){$("sidebar")&&$("wcontent")&&$("togglemenu")&&("contentnomenu"==$("wcontent").className?($("sidebar").style.display="block",$("wcontent").className="contentinner",$("togglemenu").innerHTML=localized[4]):($("sidebar").style.display="none",$("wcontent").className="contentnomenu",$("togglemenu").innerHTML=localized[3]))}var mibewRoot="";Behaviour.register({"#togglemenu":function(a){a.onclick=function(){togglemenu()}}});
|
|
||||||
EventHelper.register(window,"onload",function(){mibewRoot=updaterOptions.wroot;new Ajax.ThreadListUpdater({table:$("threadlist"),status:$("connstatus"),istatus:0}.extend(updaterOptions||{}));updaterOptions.havemenu||togglemenu()});
|
|
0
src/mibew/js/compiled/.keep
Normal file
154
src/mibew/js/jquery-1.4.2.min.js
vendored
@ -1,154 +0,0 @@
|
|||||||
/*!
|
|
||||||
* jQuery JavaScript Library v1.4.2
|
|
||||||
* http://jquery.com/
|
|
||||||
*
|
|
||||||
* Copyright 2010, John Resig
|
|
||||||
* Dual licensed under the MIT or GPL Version 2 licenses.
|
|
||||||
* http://jquery.org/license
|
|
||||||
*
|
|
||||||
* Includes Sizzle.js
|
|
||||||
* http://sizzlejs.com/
|
|
||||||
* Copyright 2010, The Dojo Foundation
|
|
||||||
* Released under the MIT, BSD, and GPL Licenses.
|
|
||||||
*
|
|
||||||
* Date: Sat Feb 13 22:33:48 2010 -0500
|
|
||||||
*/
|
|
||||||
(function(A,w){function ma(){if(!c.isReady){try{s.documentElement.doScroll("left")}catch(a){setTimeout(ma,1);return}c.ready()}}function Qa(a,b){b.src?c.ajax({url:b.src,async:false,dataType:"script"}):c.globalEval(b.text||b.textContent||b.innerHTML||"");b.parentNode&&b.parentNode.removeChild(b)}function X(a,b,d,f,e,j){var i=a.length;if(typeof b==="object"){for(var o in b)X(a,o,b[o],f,e,d);return a}if(d!==w){f=!j&&f&&c.isFunction(d);for(o=0;o<i;o++)e(a[o],b,f?d.call(a[o],o,e(a[o],b)):d,j);return a}return i?
|
|
||||||
e(a[0],b):w}function J(){return(new Date).getTime()}function Y(){return false}function Z(){return true}function na(a,b,d){d[0].type=a;return c.event.handle.apply(b,d)}function oa(a){var b,d=[],f=[],e=arguments,j,i,o,k,n,r;i=c.data(this,"events");if(!(a.liveFired===this||!i||!i.live||a.button&&a.type==="click")){a.liveFired=this;var u=i.live.slice(0);for(k=0;k<u.length;k++){i=u[k];i.origType.replace(O,"")===a.type?f.push(i.selector):u.splice(k--,1)}j=c(a.target).closest(f,a.currentTarget);n=0;for(r=
|
|
||||||
j.length;n<r;n++)for(k=0;k<u.length;k++){i=u[k];if(j[n].selector===i.selector){o=j[n].elem;f=null;if(i.preType==="mouseenter"||i.preType==="mouseleave")f=c(a.relatedTarget).closest(i.selector)[0];if(!f||f!==o)d.push({elem:o,handleObj:i})}}n=0;for(r=d.length;n<r;n++){j=d[n];a.currentTarget=j.elem;a.data=j.handleObj.data;a.handleObj=j.handleObj;if(j.handleObj.origHandler.apply(j.elem,e)===false){b=false;break}}return b}}function pa(a,b){return"live."+(a&&a!=="*"?a+".":"")+b.replace(/\./g,"`").replace(/ /g,
|
|
||||||
"&")}function qa(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function ra(a,b){var d=0;b.each(function(){if(this.nodeName===(a[d]&&a[d].nodeName)){var f=c.data(a[d++]),e=c.data(this,f);if(f=f&&f.events){delete e.handle;e.events={};for(var j in f)for(var i in f[j])c.event.add(this,j,f[j][i],f[j][i].data)}}})}function sa(a,b,d){var f,e,j;b=b&&b[0]?b[0].ownerDocument||b[0]:s;if(a.length===1&&typeof a[0]==="string"&&a[0].length<512&&b===s&&!ta.test(a[0])&&(c.support.checkClone||!ua.test(a[0]))){e=
|
|
||||||
true;if(j=c.fragments[a[0]])if(j!==1)f=j}if(!f){f=b.createDocumentFragment();c.clean(a,b,f,d)}if(e)c.fragments[a[0]]=j?f:1;return{fragment:f,cacheable:e}}function K(a,b){var d={};c.each(va.concat.apply([],va.slice(0,b)),function(){d[this]=a});return d}function wa(a){return"scrollTo"in a&&a.document?a:a.nodeType===9?a.defaultView||a.parentWindow:false}var c=function(a,b){return new c.fn.init(a,b)},Ra=A.jQuery,Sa=A.$,s=A.document,T,Ta=/^[^<]*(<[\w\W]+>)[^>]*$|^#([\w-]+)$/,Ua=/^.[^:#\[\.,]*$/,Va=/\S/,
|
|
||||||
Wa=/^(\s|\u00A0)+|(\s|\u00A0)+$/g,Xa=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,P=navigator.userAgent,xa=false,Q=[],L,$=Object.prototype.toString,aa=Object.prototype.hasOwnProperty,ba=Array.prototype.push,R=Array.prototype.slice,ya=Array.prototype.indexOf;c.fn=c.prototype={init:function(a,b){var d,f;if(!a)return this;if(a.nodeType){this.context=this[0]=a;this.length=1;return this}if(a==="body"&&!b){this.context=s;this[0]=s.body;this.selector="body";this.length=1;return this}if(typeof a==="string")if((d=Ta.exec(a))&&
|
|
||||||
(d[1]||!b))if(d[1]){f=b?b.ownerDocument||b:s;if(a=Xa.exec(a))if(c.isPlainObject(b)){a=[s.createElement(a[1])];c.fn.attr.call(a,b,true)}else a=[f.createElement(a[1])];else{a=sa([d[1]],[f]);a=(a.cacheable?a.fragment.cloneNode(true):a.fragment).childNodes}return c.merge(this,a)}else{if(b=s.getElementById(d[2])){if(b.id!==d[2])return T.find(a);this.length=1;this[0]=b}this.context=s;this.selector=a;return this}else if(!b&&/^\w+$/.test(a)){this.selector=a;this.context=s;a=s.getElementsByTagName(a);return c.merge(this,
|
|
||||||
a)}else return!b||b.jquery?(b||T).find(a):c(b).find(a);else if(c.isFunction(a))return T.ready(a);if(a.selector!==w){this.selector=a.selector;this.context=a.context}return c.makeArray(a,this)},selector:"",jquery:"1.4.2",length:0,size:function(){return this.length},toArray:function(){return R.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this.slice(a)[0]:this[a]},pushStack:function(a,b,d){var f=c();c.isArray(a)?ba.apply(f,a):c.merge(f,a);f.prevObject=this;f.context=this.context;if(b===
|
|
||||||
"find")f.selector=this.selector+(this.selector?" ":"")+d;else if(b)f.selector=this.selector+"."+b+"("+d+")";return f},each:function(a,b){return c.each(this,a,b)},ready:function(a){c.bindReady();if(c.isReady)a.call(s,c);else Q&&Q.push(a);return this},eq:function(a){return a===-1?this.slice(a):this.slice(a,+a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(R.apply(this,arguments),"slice",R.call(arguments).join(","))},map:function(a){return this.pushStack(c.map(this,
|
|
||||||
function(b,d){return a.call(b,d,b)}))},end:function(){return this.prevObject||c(null)},push:ba,sort:[].sort,splice:[].splice};c.fn.init.prototype=c.fn;c.extend=c.fn.extend=function(){var a=arguments[0]||{},b=1,d=arguments.length,f=false,e,j,i,o;if(typeof a==="boolean"){f=a;a=arguments[1]||{};b=2}if(typeof a!=="object"&&!c.isFunction(a))a={};if(d===b){a=this;--b}for(;b<d;b++)if((e=arguments[b])!=null)for(j in e){i=a[j];o=e[j];if(a!==o)if(f&&o&&(c.isPlainObject(o)||c.isArray(o))){i=i&&(c.isPlainObject(i)||
|
|
||||||
c.isArray(i))?i:c.isArray(o)?[]:{};a[j]=c.extend(f,i,o)}else if(o!==w)a[j]=o}return a};c.extend({noConflict:function(a){A.$=Sa;if(a)A.jQuery=Ra;return c},isReady:false,ready:function(){if(!c.isReady){if(!s.body)return setTimeout(c.ready,13);c.isReady=true;if(Q){for(var a,b=0;a=Q[b++];)a.call(s,c);Q=null}c.fn.triggerHandler&&c(s).triggerHandler("ready")}},bindReady:function(){if(!xa){xa=true;if(s.readyState==="complete")return c.ready();if(s.addEventListener){s.addEventListener("DOMContentLoaded",
|
|
||||||
L,false);A.addEventListener("load",c.ready,false)}else if(s.attachEvent){s.attachEvent("onreadystatechange",L);A.attachEvent("onload",c.ready);var a=false;try{a=A.frameElement==null}catch(b){}s.documentElement.doScroll&&a&&ma()}}},isFunction:function(a){return $.call(a)==="[object Function]"},isArray:function(a){return $.call(a)==="[object Array]"},isPlainObject:function(a){if(!a||$.call(a)!=="[object Object]"||a.nodeType||a.setInterval)return false;if(a.constructor&&!aa.call(a,"constructor")&&!aa.call(a.constructor.prototype,
|
|
||||||
"isPrototypeOf"))return false;var b;for(b in a);return b===w||aa.call(a,b)},isEmptyObject:function(a){for(var b in a)return false;return true},error:function(a){throw a;},parseJSON:function(a){if(typeof a!=="string"||!a)return null;a=c.trim(a);if(/^[\],:{}\s]*$/.test(a.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,"@").replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,"]").replace(/(?:^|:|,)(?:\s*\[)+/g,"")))return A.JSON&&A.JSON.parse?A.JSON.parse(a):(new Function("return "+
|
|
||||||
a))();else c.error("Invalid JSON: "+a)},noop:function(){},globalEval:function(a){if(a&&Va.test(a)){var b=s.getElementsByTagName("head")[0]||s.documentElement,d=s.createElement("script");d.type="text/javascript";if(c.support.scriptEval)d.appendChild(s.createTextNode(a));else d.text=a;b.insertBefore(d,b.firstChild);b.removeChild(d)}},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,b,d){var f,e=0,j=a.length,i=j===w||c.isFunction(a);if(d)if(i)for(f in a){if(b.apply(a[f],
|
|
||||||
d)===false)break}else for(;e<j;){if(b.apply(a[e++],d)===false)break}else if(i)for(f in a){if(b.call(a[f],f,a[f])===false)break}else for(d=a[0];e<j&&b.call(d,e,d)!==false;d=a[++e]);return a},trim:function(a){return(a||"").replace(Wa,"")},makeArray:function(a,b){b=b||[];if(a!=null)a.length==null||typeof a==="string"||c.isFunction(a)||typeof a!=="function"&&a.setInterval?ba.call(b,a):c.merge(b,a);return b},inArray:function(a,b){if(b.indexOf)return b.indexOf(a);for(var d=0,f=b.length;d<f;d++)if(b[d]===
|
|
||||||
a)return d;return-1},merge:function(a,b){var d=a.length,f=0;if(typeof b.length==="number")for(var e=b.length;f<e;f++)a[d++]=b[f];else for(;b[f]!==w;)a[d++]=b[f++];a.length=d;return a},grep:function(a,b,d){for(var f=[],e=0,j=a.length;e<j;e++)!d!==!b(a[e],e)&&f.push(a[e]);return f},map:function(a,b,d){for(var f=[],e,j=0,i=a.length;j<i;j++){e=b(a[j],j,d);if(e!=null)f[f.length]=e}return f.concat.apply([],f)},guid:1,proxy:function(a,b,d){if(arguments.length===2)if(typeof b==="string"){d=a;a=d[b];b=w}else if(b&&
|
|
||||||
!c.isFunction(b)){d=b;b=w}if(!b&&a)b=function(){return a.apply(d||this,arguments)};if(a)b.guid=a.guid=a.guid||b.guid||c.guid++;return b},uaMatch:function(a){a=a.toLowerCase();a=/(webkit)[ \/]([\w.]+)/.exec(a)||/(opera)(?:.*version)?[ \/]([\w.]+)/.exec(a)||/(msie) ([\w.]+)/.exec(a)||!/compatible/.test(a)&&/(mozilla)(?:.*? rv:([\w.]+))?/.exec(a)||[];return{browser:a[1]||"",version:a[2]||"0"}},browser:{}});P=c.uaMatch(P);if(P.browser){c.browser[P.browser]=true;c.browser.version=P.version}if(c.browser.webkit)c.browser.safari=
|
|
||||||
true;if(ya)c.inArray=function(a,b){return ya.call(b,a)};T=c(s);if(s.addEventListener)L=function(){s.removeEventListener("DOMContentLoaded",L,false);c.ready()};else if(s.attachEvent)L=function(){if(s.readyState==="complete"){s.detachEvent("onreadystatechange",L);c.ready()}};(function(){c.support={};var a=s.documentElement,b=s.createElement("script"),d=s.createElement("div"),f="script"+J();d.style.display="none";d.innerHTML=" <link/><table></table><a href='/a' style='color:red;float:left;opacity:.55;'>a</a><input type='checkbox'/>";
|
|
||||||
var e=d.getElementsByTagName("*"),j=d.getElementsByTagName("a")[0];if(!(!e||!e.length||!j)){c.support={leadingWhitespace:d.firstChild.nodeType===3,tbody:!d.getElementsByTagName("tbody").length,htmlSerialize:!!d.getElementsByTagName("link").length,style:/red/.test(j.getAttribute("style")),hrefNormalized:j.getAttribute("href")==="/a",opacity:/^0.55$/.test(j.style.opacity),cssFloat:!!j.style.cssFloat,checkOn:d.getElementsByTagName("input")[0].value==="on",optSelected:s.createElement("select").appendChild(s.createElement("option")).selected,
|
|
||||||
parentNode:d.removeChild(d.appendChild(s.createElement("div"))).parentNode===null,deleteExpando:true,checkClone:false,scriptEval:false,noCloneEvent:true,boxModel:null};b.type="text/javascript";try{b.appendChild(s.createTextNode("window."+f+"=1;"))}catch(i){}a.insertBefore(b,a.firstChild);if(A[f]){c.support.scriptEval=true;delete A[f]}try{delete b.test}catch(o){c.support.deleteExpando=false}a.removeChild(b);if(d.attachEvent&&d.fireEvent){d.attachEvent("onclick",function k(){c.support.noCloneEvent=
|
|
||||||
false;d.detachEvent("onclick",k)});d.cloneNode(true).fireEvent("onclick")}d=s.createElement("div");d.innerHTML="<input type='radio' name='radiotest' checked='checked'/>";a=s.createDocumentFragment();a.appendChild(d.firstChild);c.support.checkClone=a.cloneNode(true).cloneNode(true).lastChild.checked;c(function(){var k=s.createElement("div");k.style.width=k.style.paddingLeft="1px";s.body.appendChild(k);c.boxModel=c.support.boxModel=k.offsetWidth===2;s.body.removeChild(k).style.display="none"});a=function(k){var n=
|
|
||||||
s.createElement("div");k="on"+k;var r=k in n;if(!r){n.setAttribute(k,"return;");r=typeof n[k]==="function"}return r};c.support.submitBubbles=a("submit");c.support.changeBubbles=a("change");a=b=d=e=j=null}})();c.props={"for":"htmlFor","class":"className",readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing",rowspan:"rowSpan",colspan:"colSpan",tabindex:"tabIndex",usemap:"useMap",frameborder:"frameBorder"};var G="jQuery"+J(),Ya=0,za={};c.extend({cache:{},expando:G,noData:{embed:true,object:true,
|
|
||||||
applet:true},data:function(a,b,d){if(!(a.nodeName&&c.noData[a.nodeName.toLowerCase()])){a=a==A?za:a;var f=a[G],e=c.cache;if(!f&&typeof b==="string"&&d===w)return null;f||(f=++Ya);if(typeof b==="object"){a[G]=f;e[f]=c.extend(true,{},b)}else if(!e[f]){a[G]=f;e[f]={}}a=e[f];if(d!==w)a[b]=d;return typeof b==="string"?a[b]:a}},removeData:function(a,b){if(!(a.nodeName&&c.noData[a.nodeName.toLowerCase()])){a=a==A?za:a;var d=a[G],f=c.cache,e=f[d];if(b){if(e){delete e[b];c.isEmptyObject(e)&&c.removeData(a)}}else{if(c.support.deleteExpando)delete a[c.expando];
|
|
||||||
else a.removeAttribute&&a.removeAttribute(c.expando);delete f[d]}}}});c.fn.extend({data:function(a,b){if(typeof a==="undefined"&&this.length)return c.data(this[0]);else if(typeof a==="object")return this.each(function(){c.data(this,a)});var d=a.split(".");d[1]=d[1]?"."+d[1]:"";if(b===w){var f=this.triggerHandler("getData"+d[1]+"!",[d[0]]);if(f===w&&this.length)f=c.data(this[0],a);return f===w&&d[1]?this.data(d[0]):f}else return this.trigger("setData"+d[1]+"!",[d[0],b]).each(function(){c.data(this,
|
|
||||||
a,b)})},removeData:function(a){return this.each(function(){c.removeData(this,a)})}});c.extend({queue:function(a,b,d){if(a){b=(b||"fx")+"queue";var f=c.data(a,b);if(!d)return f||[];if(!f||c.isArray(d))f=c.data(a,b,c.makeArray(d));else f.push(d);return f}},dequeue:function(a,b){b=b||"fx";var d=c.queue(a,b),f=d.shift();if(f==="inprogress")f=d.shift();if(f){b==="fx"&&d.unshift("inprogress");f.call(a,function(){c.dequeue(a,b)})}}});c.fn.extend({queue:function(a,b){if(typeof a!=="string"){b=a;a="fx"}if(b===
|
|
||||||
w)return c.queue(this[0],a);return this.each(function(){var d=c.queue(this,a,b);a==="fx"&&d[0]!=="inprogress"&&c.dequeue(this,a)})},dequeue:function(a){return this.each(function(){c.dequeue(this,a)})},delay:function(a,b){a=c.fx?c.fx.speeds[a]||a:a;b=b||"fx";return this.queue(b,function(){var d=this;setTimeout(function(){c.dequeue(d,b)},a)})},clearQueue:function(a){return this.queue(a||"fx",[])}});var Aa=/[\n\t]/g,ca=/\s+/,Za=/\r/g,$a=/href|src|style/,ab=/(button|input)/i,bb=/(button|input|object|select|textarea)/i,
|
|
||||||
cb=/^(a|area)$/i,Ba=/radio|checkbox/;c.fn.extend({attr:function(a,b){return X(this,a,b,true,c.attr)},removeAttr:function(a){return this.each(function(){c.attr(this,a,"");this.nodeType===1&&this.removeAttribute(a)})},addClass:function(a){if(c.isFunction(a))return this.each(function(n){var r=c(this);r.addClass(a.call(this,n,r.attr("class")))});if(a&&typeof a==="string")for(var b=(a||"").split(ca),d=0,f=this.length;d<f;d++){var e=this[d];if(e.nodeType===1)if(e.className){for(var j=" "+e.className+" ",
|
|
||||||
i=e.className,o=0,k=b.length;o<k;o++)if(j.indexOf(" "+b[o]+" ")<0)i+=" "+b[o];e.className=c.trim(i)}else e.className=a}return this},removeClass:function(a){if(c.isFunction(a))return this.each(function(k){var n=c(this);n.removeClass(a.call(this,k,n.attr("class")))});if(a&&typeof a==="string"||a===w)for(var b=(a||"").split(ca),d=0,f=this.length;d<f;d++){var e=this[d];if(e.nodeType===1&&e.className)if(a){for(var j=(" "+e.className+" ").replace(Aa," "),i=0,o=b.length;i<o;i++)j=j.replace(" "+b[i]+" ",
|
|
||||||
" ");e.className=c.trim(j)}else e.className=""}return this},toggleClass:function(a,b){var d=typeof a,f=typeof b==="boolean";if(c.isFunction(a))return this.each(function(e){var j=c(this);j.toggleClass(a.call(this,e,j.attr("class"),b),b)});return this.each(function(){if(d==="string")for(var e,j=0,i=c(this),o=b,k=a.split(ca);e=k[j++];){o=f?o:!i.hasClass(e);i[o?"addClass":"removeClass"](e)}else if(d==="undefined"||d==="boolean"){this.className&&c.data(this,"__className__",this.className);this.className=
|
|
||||||
this.className||a===false?"":c.data(this,"__className__")||""}})},hasClass:function(a){a=" "+a+" ";for(var b=0,d=this.length;b<d;b++)if((" "+this[b].className+" ").replace(Aa," ").indexOf(a)>-1)return true;return false},val:function(a){if(a===w){var b=this[0];if(b){if(c.nodeName(b,"option"))return(b.attributes.value||{}).specified?b.value:b.text;if(c.nodeName(b,"select")){var d=b.selectedIndex,f=[],e=b.options;b=b.type==="select-one";if(d<0)return null;var j=b?d:0;for(d=b?d+1:e.length;j<d;j++){var i=
|
|
||||||
e[j];if(i.selected){a=c(i).val();if(b)return a;f.push(a)}}return f}if(Ba.test(b.type)&&!c.support.checkOn)return b.getAttribute("value")===null?"on":b.value;return(b.value||"").replace(Za,"")}return w}var o=c.isFunction(a);return this.each(function(k){var n=c(this),r=a;if(this.nodeType===1){if(o)r=a.call(this,k,n.val());if(typeof r==="number")r+="";if(c.isArray(r)&&Ba.test(this.type))this.checked=c.inArray(n.val(),r)>=0;else if(c.nodeName(this,"select")){var u=c.makeArray(r);c("option",this).each(function(){this.selected=
|
|
||||||
c.inArray(c(this).val(),u)>=0});if(!u.length)this.selectedIndex=-1}else this.value=r}})}});c.extend({attrFn:{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true},attr:function(a,b,d,f){if(!a||a.nodeType===3||a.nodeType===8)return w;if(f&&b in c.attrFn)return c(a)[b](d);f=a.nodeType!==1||!c.isXMLDoc(a);var e=d!==w;b=f&&c.props[b]||b;if(a.nodeType===1){var j=$a.test(b);if(b in a&&f&&!j){if(e){b==="type"&&ab.test(a.nodeName)&&a.parentNode&&c.error("type property can't be changed");
|
|
||||||
a[b]=d}if(c.nodeName(a,"form")&&a.getAttributeNode(b))return a.getAttributeNode(b).nodeValue;if(b==="tabIndex")return(b=a.getAttributeNode("tabIndex"))&&b.specified?b.value:bb.test(a.nodeName)||cb.test(a.nodeName)&&a.href?0:w;return a[b]}if(!c.support.style&&f&&b==="style"){if(e)a.style.cssText=""+d;return a.style.cssText}e&&a.setAttribute(b,""+d);a=!c.support.hrefNormalized&&f&&j?a.getAttribute(b,2):a.getAttribute(b);return a===null?w:a}return c.style(a,b,d)}});var O=/\.(.*)$/,db=function(a){return a.replace(/[^\w\s\.\|`]/g,
|
|
||||||
function(b){return"\\"+b})};c.event={add:function(a,b,d,f){if(!(a.nodeType===3||a.nodeType===8)){if(a.setInterval&&a!==A&&!a.frameElement)a=A;var e,j;if(d.handler){e=d;d=e.handler}if(!d.guid)d.guid=c.guid++;if(j=c.data(a)){var i=j.events=j.events||{},o=j.handle;if(!o)j.handle=o=function(){return typeof c!=="undefined"&&!c.event.triggered?c.event.handle.apply(o.elem,arguments):w};o.elem=a;b=b.split(" ");for(var k,n=0,r;k=b[n++];){j=e?c.extend({},e):{handler:d,data:f};if(k.indexOf(".")>-1){r=k.split(".");
|
|
||||||
k=r.shift();j.namespace=r.slice(0).sort().join(".")}else{r=[];j.namespace=""}j.type=k;j.guid=d.guid;var u=i[k],z=c.event.special[k]||{};if(!u){u=i[k]=[];if(!z.setup||z.setup.call(a,f,r,o)===false)if(a.addEventListener)a.addEventListener(k,o,false);else a.attachEvent&&a.attachEvent("on"+k,o)}if(z.add){z.add.call(a,j);if(!j.handler.guid)j.handler.guid=d.guid}u.push(j);c.event.global[k]=true}a=null}}},global:{},remove:function(a,b,d,f){if(!(a.nodeType===3||a.nodeType===8)){var e,j=0,i,o,k,n,r,u,z=c.data(a),
|
|
||||||
C=z&&z.events;if(z&&C){if(b&&b.type){d=b.handler;b=b.type}if(!b||typeof b==="string"&&b.charAt(0)==="."){b=b||"";for(e in C)c.event.remove(a,e+b)}else{for(b=b.split(" ");e=b[j++];){n=e;i=e.indexOf(".")<0;o=[];if(!i){o=e.split(".");e=o.shift();k=new RegExp("(^|\\.)"+c.map(o.slice(0).sort(),db).join("\\.(?:.*\\.)?")+"(\\.|$)")}if(r=C[e])if(d){n=c.event.special[e]||{};for(B=f||0;B<r.length;B++){u=r[B];if(d.guid===u.guid){if(i||k.test(u.namespace)){f==null&&r.splice(B--,1);n.remove&&n.remove.call(a,u)}if(f!=
|
|
||||||
null)break}}if(r.length===0||f!=null&&r.length===1){if(!n.teardown||n.teardown.call(a,o)===false)Ca(a,e,z.handle);delete C[e]}}else for(var B=0;B<r.length;B++){u=r[B];if(i||k.test(u.namespace)){c.event.remove(a,n,u.handler,B);r.splice(B--,1)}}}if(c.isEmptyObject(C)){if(b=z.handle)b.elem=null;delete z.events;delete z.handle;c.isEmptyObject(z)&&c.removeData(a)}}}}},trigger:function(a,b,d,f){var e=a.type||a;if(!f){a=typeof a==="object"?a[G]?a:c.extend(c.Event(e),a):c.Event(e);if(e.indexOf("!")>=0){a.type=
|
|
||||||
e=e.slice(0,-1);a.exclusive=true}if(!d){a.stopPropagation();c.event.global[e]&&c.each(c.cache,function(){this.events&&this.events[e]&&c.event.trigger(a,b,this.handle.elem)})}if(!d||d.nodeType===3||d.nodeType===8)return w;a.result=w;a.target=d;b=c.makeArray(b);b.unshift(a)}a.currentTarget=d;(f=c.data(d,"handle"))&&f.apply(d,b);f=d.parentNode||d.ownerDocument;try{if(!(d&&d.nodeName&&c.noData[d.nodeName.toLowerCase()]))if(d["on"+e]&&d["on"+e].apply(d,b)===false)a.result=false}catch(j){}if(!a.isPropagationStopped()&&
|
|
||||||
f)c.event.trigger(a,b,f,true);else if(!a.isDefaultPrevented()){f=a.target;var i,o=c.nodeName(f,"a")&&e==="click",k=c.event.special[e]||{};if((!k._default||k._default.call(d,a)===false)&&!o&&!(f&&f.nodeName&&c.noData[f.nodeName.toLowerCase()])){try{if(f[e]){if(i=f["on"+e])f["on"+e]=null;c.event.triggered=true;f[e]()}}catch(n){}if(i)f["on"+e]=i;c.event.triggered=false}}},handle:function(a){var b,d,f,e;a=arguments[0]=c.event.fix(a||A.event);a.currentTarget=this;b=a.type.indexOf(".")<0&&!a.exclusive;
|
|
||||||
if(!b){d=a.type.split(".");a.type=d.shift();f=new RegExp("(^|\\.)"+d.slice(0).sort().join("\\.(?:.*\\.)?")+"(\\.|$)")}e=c.data(this,"events");d=e[a.type];if(e&&d){d=d.slice(0);e=0;for(var j=d.length;e<j;e++){var i=d[e];if(b||f.test(i.namespace)){a.handler=i.handler;a.data=i.data;a.handleObj=i;i=i.handler.apply(this,arguments);if(i!==w){a.result=i;if(i===false){a.preventDefault();a.stopPropagation()}}if(a.isImmediatePropagationStopped())break}}}return a.result},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),
|
|
||||||
fix:function(a){if(a[G])return a;var b=a;a=c.Event(b);for(var d=this.props.length,f;d;){f=this.props[--d];a[f]=b[f]}if(!a.target)a.target=a.srcElement||s;if(a.target.nodeType===3)a.target=a.target.parentNode;if(!a.relatedTarget&&a.fromElement)a.relatedTarget=a.fromElement===a.target?a.toElement:a.fromElement;if(a.pageX==null&&a.clientX!=null){b=s.documentElement;d=s.body;a.pageX=a.clientX+(b&&b.scrollLeft||d&&d.scrollLeft||0)-(b&&b.clientLeft||d&&d.clientLeft||0);a.pageY=a.clientY+(b&&b.scrollTop||
|
|
||||||
d&&d.scrollTop||0)-(b&&b.clientTop||d&&d.clientTop||0)}if(!a.which&&(a.charCode||a.charCode===0?a.charCode:a.keyCode))a.which=a.charCode||a.keyCode;if(!a.metaKey&&a.ctrlKey)a.metaKey=a.ctrlKey;if(!a.which&&a.button!==w)a.which=a.button&1?1:a.button&2?3:a.button&4?2:0;return a},guid:1E8,proxy:c.proxy,special:{ready:{setup:c.bindReady,teardown:c.noop},live:{add:function(a){c.event.add(this,a.origType,c.extend({},a,{handler:oa}))},remove:function(a){var b=true,d=a.origType.replace(O,"");c.each(c.data(this,
|
|
||||||
"events").live||[],function(){if(d===this.origType.replace(O,""))return b=false});b&&c.event.remove(this,a.origType,oa)}},beforeunload:{setup:function(a,b,d){if(this.setInterval)this.onbeforeunload=d;return false},teardown:function(a,b){if(this.onbeforeunload===b)this.onbeforeunload=null}}}};var Ca=s.removeEventListener?function(a,b,d){a.removeEventListener(b,d,false)}:function(a,b,d){a.detachEvent("on"+b,d)};c.Event=function(a){if(!this.preventDefault)return new c.Event(a);if(a&&a.type){this.originalEvent=
|
|
||||||
a;this.type=a.type}else this.type=a;this.timeStamp=J();this[G]=true};c.Event.prototype={preventDefault:function(){this.isDefaultPrevented=Z;var a=this.originalEvent;if(a){a.preventDefault&&a.preventDefault();a.returnValue=false}},stopPropagation:function(){this.isPropagationStopped=Z;var a=this.originalEvent;if(a){a.stopPropagation&&a.stopPropagation();a.cancelBubble=true}},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=Z;this.stopPropagation()},isDefaultPrevented:Y,isPropagationStopped:Y,
|
|
||||||
isImmediatePropagationStopped:Y};var Da=function(a){var b=a.relatedTarget;try{for(;b&&b!==this;)b=b.parentNode;if(b!==this){a.type=a.data;c.event.handle.apply(this,arguments)}}catch(d){}},Ea=function(a){a.type=a.data;c.event.handle.apply(this,arguments)};c.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){c.event.special[a]={setup:function(d){c.event.add(this,b,d&&d.selector?Ea:Da,a)},teardown:function(d){c.event.remove(this,b,d&&d.selector?Ea:Da)}}});if(!c.support.submitBubbles)c.event.special.submit=
|
|
||||||
{setup:function(){if(this.nodeName.toLowerCase()!=="form"){c.event.add(this,"click.specialSubmit",function(a){var b=a.target,d=b.type;if((d==="submit"||d==="image")&&c(b).closest("form").length)return na("submit",this,arguments)});c.event.add(this,"keypress.specialSubmit",function(a){var b=a.target,d=b.type;if((d==="text"||d==="password")&&c(b).closest("form").length&&a.keyCode===13)return na("submit",this,arguments)})}else return false},teardown:function(){c.event.remove(this,".specialSubmit")}};
|
|
||||||
if(!c.support.changeBubbles){var da=/textarea|input|select/i,ea,Fa=function(a){var b=a.type,d=a.value;if(b==="radio"||b==="checkbox")d=a.checked;else if(b==="select-multiple")d=a.selectedIndex>-1?c.map(a.options,function(f){return f.selected}).join("-"):"";else if(a.nodeName.toLowerCase()==="select")d=a.selectedIndex;return d},fa=function(a,b){var d=a.target,f,e;if(!(!da.test(d.nodeName)||d.readOnly)){f=c.data(d,"_change_data");e=Fa(d);if(a.type!=="focusout"||d.type!=="radio")c.data(d,"_change_data",
|
|
||||||
e);if(!(f===w||e===f))if(f!=null||e){a.type="change";return c.event.trigger(a,b,d)}}};c.event.special.change={filters:{focusout:fa,click:function(a){var b=a.target,d=b.type;if(d==="radio"||d==="checkbox"||b.nodeName.toLowerCase()==="select")return fa.call(this,a)},keydown:function(a){var b=a.target,d=b.type;if(a.keyCode===13&&b.nodeName.toLowerCase()!=="textarea"||a.keyCode===32&&(d==="checkbox"||d==="radio")||d==="select-multiple")return fa.call(this,a)},beforeactivate:function(a){a=a.target;c.data(a,
|
|
||||||
"_change_data",Fa(a))}},setup:function(){if(this.type==="file")return false;for(var a in ea)c.event.add(this,a+".specialChange",ea[a]);return da.test(this.nodeName)},teardown:function(){c.event.remove(this,".specialChange");return da.test(this.nodeName)}};ea=c.event.special.change.filters}s.addEventListener&&c.each({focus:"focusin",blur:"focusout"},function(a,b){function d(f){f=c.event.fix(f);f.type=b;return c.event.handle.call(this,f)}c.event.special[b]={setup:function(){this.addEventListener(a,
|
|
||||||
d,true)},teardown:function(){this.removeEventListener(a,d,true)}}});c.each(["bind","one"],function(a,b){c.fn[b]=function(d,f,e){if(typeof d==="object"){for(var j in d)this[b](j,f,d[j],e);return this}if(c.isFunction(f)){e=f;f=w}var i=b==="one"?c.proxy(e,function(k){c(this).unbind(k,i);return e.apply(this,arguments)}):e;if(d==="unload"&&b!=="one")this.one(d,f,e);else{j=0;for(var o=this.length;j<o;j++)c.event.add(this[j],d,i,f)}return this}});c.fn.extend({unbind:function(a,b){if(typeof a==="object"&&
|
|
||||||
!a.preventDefault)for(var d in a)this.unbind(d,a[d]);else{d=0;for(var f=this.length;d<f;d++)c.event.remove(this[d],a,b)}return this},delegate:function(a,b,d,f){return this.live(b,d,f,a)},undelegate:function(a,b,d){return arguments.length===0?this.unbind("live"):this.die(b,null,d,a)},trigger:function(a,b){return this.each(function(){c.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0]){a=c.Event(a);a.preventDefault();a.stopPropagation();c.event.trigger(a,b,this[0]);return a.result}},
|
|
||||||
toggle:function(a){for(var b=arguments,d=1;d<b.length;)c.proxy(a,b[d++]);return this.click(c.proxy(a,function(f){var e=(c.data(this,"lastToggle"+a.guid)||0)%d;c.data(this,"lastToggle"+a.guid,e+1);f.preventDefault();return b[e].apply(this,arguments)||false}))},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}});var Ga={focus:"focusin",blur:"focusout",mouseenter:"mouseover",mouseleave:"mouseout"};c.each(["live","die"],function(a,b){c.fn[b]=function(d,f,e,j){var i,o=0,k,n,r=j||this.selector,
|
|
||||||
u=j?this:c(this.context);if(c.isFunction(f)){e=f;f=w}for(d=(d||"").split(" ");(i=d[o++])!=null;){j=O.exec(i);k="";if(j){k=j[0];i=i.replace(O,"")}if(i==="hover")d.push("mouseenter"+k,"mouseleave"+k);else{n=i;if(i==="focus"||i==="blur"){d.push(Ga[i]+k);i+=k}else i=(Ga[i]||i)+k;b==="live"?u.each(function(){c.event.add(this,pa(i,r),{data:f,selector:r,handler:e,origType:i,origHandler:e,preType:n})}):u.unbind(pa(i,r),e)}}return this}});c.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error".split(" "),
|
|
||||||
function(a,b){c.fn[b]=function(d){return d?this.bind(b,d):this.trigger(b)};if(c.attrFn)c.attrFn[b]=true});A.attachEvent&&!A.addEventListener&&A.attachEvent("onunload",function(){for(var a in c.cache)if(c.cache[a].handle)try{c.event.remove(c.cache[a].handle.elem)}catch(b){}});(function(){function a(g){for(var h="",l,m=0;g[m];m++){l=g[m];if(l.nodeType===3||l.nodeType===4)h+=l.nodeValue;else if(l.nodeType!==8)h+=a(l.childNodes)}return h}function b(g,h,l,m,q,p){q=0;for(var v=m.length;q<v;q++){var t=m[q];
|
|
||||||
if(t){t=t[g];for(var y=false;t;){if(t.sizcache===l){y=m[t.sizset];break}if(t.nodeType===1&&!p){t.sizcache=l;t.sizset=q}if(t.nodeName.toLowerCase()===h){y=t;break}t=t[g]}m[q]=y}}}function d(g,h,l,m,q,p){q=0;for(var v=m.length;q<v;q++){var t=m[q];if(t){t=t[g];for(var y=false;t;){if(t.sizcache===l){y=m[t.sizset];break}if(t.nodeType===1){if(!p){t.sizcache=l;t.sizset=q}if(typeof h!=="string"){if(t===h){y=true;break}}else if(k.filter(h,[t]).length>0){y=t;break}}t=t[g]}m[q]=y}}}var f=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,
|
|
||||||
e=0,j=Object.prototype.toString,i=false,o=true;[0,0].sort(function(){o=false;return 0});var k=function(g,h,l,m){l=l||[];var q=h=h||s;if(h.nodeType!==1&&h.nodeType!==9)return[];if(!g||typeof g!=="string")return l;for(var p=[],v,t,y,S,H=true,M=x(h),I=g;(f.exec(""),v=f.exec(I))!==null;){I=v[3];p.push(v[1]);if(v[2]){S=v[3];break}}if(p.length>1&&r.exec(g))if(p.length===2&&n.relative[p[0]])t=ga(p[0]+p[1],h);else for(t=n.relative[p[0]]?[h]:k(p.shift(),h);p.length;){g=p.shift();if(n.relative[g])g+=p.shift();
|
|
||||||
t=ga(g,t)}else{if(!m&&p.length>1&&h.nodeType===9&&!M&&n.match.ID.test(p[0])&&!n.match.ID.test(p[p.length-1])){v=k.find(p.shift(),h,M);h=v.expr?k.filter(v.expr,v.set)[0]:v.set[0]}if(h){v=m?{expr:p.pop(),set:z(m)}:k.find(p.pop(),p.length===1&&(p[0]==="~"||p[0]==="+")&&h.parentNode?h.parentNode:h,M);t=v.expr?k.filter(v.expr,v.set):v.set;if(p.length>0)y=z(t);else H=false;for(;p.length;){var D=p.pop();v=D;if(n.relative[D])v=p.pop();else D="";if(v==null)v=h;n.relative[D](y,v,M)}}else y=[]}y||(y=t);y||k.error(D||
|
|
||||||
g);if(j.call(y)==="[object Array]")if(H)if(h&&h.nodeType===1)for(g=0;y[g]!=null;g++){if(y[g]&&(y[g]===true||y[g].nodeType===1&&E(h,y[g])))l.push(t[g])}else for(g=0;y[g]!=null;g++)y[g]&&y[g].nodeType===1&&l.push(t[g]);else l.push.apply(l,y);else z(y,l);if(S){k(S,q,l,m);k.uniqueSort(l)}return l};k.uniqueSort=function(g){if(B){i=o;g.sort(B);if(i)for(var h=1;h<g.length;h++)g[h]===g[h-1]&&g.splice(h--,1)}return g};k.matches=function(g,h){return k(g,null,null,h)};k.find=function(g,h,l){var m,q;if(!g)return[];
|
|
||||||
for(var p=0,v=n.order.length;p<v;p++){var t=n.order[p];if(q=n.leftMatch[t].exec(g)){var y=q[1];q.splice(1,1);if(y.substr(y.length-1)!=="\\"){q[1]=(q[1]||"").replace(/\\/g,"");m=n.find[t](q,h,l);if(m!=null){g=g.replace(n.match[t],"");break}}}}m||(m=h.getElementsByTagName("*"));return{set:m,expr:g}};k.filter=function(g,h,l,m){for(var q=g,p=[],v=h,t,y,S=h&&h[0]&&x(h[0]);g&&h.length;){for(var H in n.filter)if((t=n.leftMatch[H].exec(g))!=null&&t[2]){var M=n.filter[H],I,D;D=t[1];y=false;t.splice(1,1);if(D.substr(D.length-
|
|
||||||
1)!=="\\"){if(v===p)p=[];if(n.preFilter[H])if(t=n.preFilter[H](t,v,l,p,m,S)){if(t===true)continue}else y=I=true;if(t)for(var U=0;(D=v[U])!=null;U++)if(D){I=M(D,t,U,v);var Ha=m^!!I;if(l&&I!=null)if(Ha)y=true;else v[U]=false;else if(Ha){p.push(D);y=true}}if(I!==w){l||(v=p);g=g.replace(n.match[H],"");if(!y)return[];break}}}if(g===q)if(y==null)k.error(g);else break;q=g}return v};k.error=function(g){throw"Syntax error, unrecognized expression: "+g;};var n=k.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF-]|\\.)+)/,
|
|
||||||
CLASS:/\.((?:[\w\u00c0-\uFFFF-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\((even|odd|[\dn+-]*)\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(g){return g.getAttribute("href")}},
|
|
||||||
relative:{"+":function(g,h){var l=typeof h==="string",m=l&&!/\W/.test(h);l=l&&!m;if(m)h=h.toLowerCase();m=0;for(var q=g.length,p;m<q;m++)if(p=g[m]){for(;(p=p.previousSibling)&&p.nodeType!==1;);g[m]=l||p&&p.nodeName.toLowerCase()===h?p||false:p===h}l&&k.filter(h,g,true)},">":function(g,h){var l=typeof h==="string";if(l&&!/\W/.test(h)){h=h.toLowerCase();for(var m=0,q=g.length;m<q;m++){var p=g[m];if(p){l=p.parentNode;g[m]=l.nodeName.toLowerCase()===h?l:false}}}else{m=0;for(q=g.length;m<q;m++)if(p=g[m])g[m]=
|
|
||||||
l?p.parentNode:p.parentNode===h;l&&k.filter(h,g,true)}},"":function(g,h,l){var m=e++,q=d;if(typeof h==="string"&&!/\W/.test(h)){var p=h=h.toLowerCase();q=b}q("parentNode",h,m,g,p,l)},"~":function(g,h,l){var m=e++,q=d;if(typeof h==="string"&&!/\W/.test(h)){var p=h=h.toLowerCase();q=b}q("previousSibling",h,m,g,p,l)}},find:{ID:function(g,h,l){if(typeof h.getElementById!=="undefined"&&!l)return(g=h.getElementById(g[1]))?[g]:[]},NAME:function(g,h){if(typeof h.getElementsByName!=="undefined"){var l=[];
|
|
||||||
h=h.getElementsByName(g[1]);for(var m=0,q=h.length;m<q;m++)h[m].getAttribute("name")===g[1]&&l.push(h[m]);return l.length===0?null:l}},TAG:function(g,h){return h.getElementsByTagName(g[1])}},preFilter:{CLASS:function(g,h,l,m,q,p){g=" "+g[1].replace(/\\/g,"")+" ";if(p)return g;p=0;for(var v;(v=h[p])!=null;p++)if(v)if(q^(v.className&&(" "+v.className+" ").replace(/[\t\n]/g," ").indexOf(g)>=0))l||m.push(v);else if(l)h[p]=false;return false},ID:function(g){return g[1].replace(/\\/g,"")},TAG:function(g){return g[1].toLowerCase()},
|
|
||||||
CHILD:function(g){if(g[1]==="nth"){var h=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(g[2]==="even"&&"2n"||g[2]==="odd"&&"2n+1"||!/\D/.test(g[2])&&"0n+"+g[2]||g[2]);g[2]=h[1]+(h[2]||1)-0;g[3]=h[3]-0}g[0]=e++;return g},ATTR:function(g,h,l,m,q,p){h=g[1].replace(/\\/g,"");if(!p&&n.attrMap[h])g[1]=n.attrMap[h];if(g[2]==="~=")g[4]=" "+g[4]+" ";return g},PSEUDO:function(g,h,l,m,q){if(g[1]==="not")if((f.exec(g[3])||"").length>1||/^\w/.test(g[3]))g[3]=k(g[3],null,null,h);else{g=k.filter(g[3],h,l,true^q);l||m.push.apply(m,
|
|
||||||
g);return false}else if(n.match.POS.test(g[0])||n.match.CHILD.test(g[0]))return true;return g},POS:function(g){g.unshift(true);return g}},filters:{enabled:function(g){return g.disabled===false&&g.type!=="hidden"},disabled:function(g){return g.disabled===true},checked:function(g){return g.checked===true},selected:function(g){return g.selected===true},parent:function(g){return!!g.firstChild},empty:function(g){return!g.firstChild},has:function(g,h,l){return!!k(l[3],g).length},header:function(g){return/h\d/i.test(g.nodeName)},
|
|
||||||
text:function(g){return"text"===g.type},radio:function(g){return"radio"===g.type},checkbox:function(g){return"checkbox"===g.type},file:function(g){return"file"===g.type},password:function(g){return"password"===g.type},submit:function(g){return"submit"===g.type},image:function(g){return"image"===g.type},reset:function(g){return"reset"===g.type},button:function(g){return"button"===g.type||g.nodeName.toLowerCase()==="button"},input:function(g){return/input|select|textarea|button/i.test(g.nodeName)}},
|
|
||||||
setFilters:{first:function(g,h){return h===0},last:function(g,h,l,m){return h===m.length-1},even:function(g,h){return h%2===0},odd:function(g,h){return h%2===1},lt:function(g,h,l){return h<l[3]-0},gt:function(g,h,l){return h>l[3]-0},nth:function(g,h,l){return l[3]-0===h},eq:function(g,h,l){return l[3]-0===h}},filter:{PSEUDO:function(g,h,l,m){var q=h[1],p=n.filters[q];if(p)return p(g,l,h,m);else if(q==="contains")return(g.textContent||g.innerText||a([g])||"").indexOf(h[3])>=0;else if(q==="not"){h=
|
|
||||||
h[3];l=0;for(m=h.length;l<m;l++)if(h[l]===g)return false;return true}else k.error("Syntax error, unrecognized expression: "+q)},CHILD:function(g,h){var l=h[1],m=g;switch(l){case "only":case "first":for(;m=m.previousSibling;)if(m.nodeType===1)return false;if(l==="first")return true;m=g;case "last":for(;m=m.nextSibling;)if(m.nodeType===1)return false;return true;case "nth":l=h[2];var q=h[3];if(l===1&&q===0)return true;h=h[0];var p=g.parentNode;if(p&&(p.sizcache!==h||!g.nodeIndex)){var v=0;for(m=p.firstChild;m;m=
|
|
||||||
m.nextSibling)if(m.nodeType===1)m.nodeIndex=++v;p.sizcache=h}g=g.nodeIndex-q;return l===0?g===0:g%l===0&&g/l>=0}},ID:function(g,h){return g.nodeType===1&&g.getAttribute("id")===h},TAG:function(g,h){return h==="*"&&g.nodeType===1||g.nodeName.toLowerCase()===h},CLASS:function(g,h){return(" "+(g.className||g.getAttribute("class"))+" ").indexOf(h)>-1},ATTR:function(g,h){var l=h[1];g=n.attrHandle[l]?n.attrHandle[l](g):g[l]!=null?g[l]:g.getAttribute(l);l=g+"";var m=h[2];h=h[4];return g==null?m==="!=":m===
|
|
||||||
"="?l===h:m==="*="?l.indexOf(h)>=0:m==="~="?(" "+l+" ").indexOf(h)>=0:!h?l&&g!==false:m==="!="?l!==h:m==="^="?l.indexOf(h)===0:m==="$="?l.substr(l.length-h.length)===h:m==="|="?l===h||l.substr(0,h.length+1)===h+"-":false},POS:function(g,h,l,m){var q=n.setFilters[h[2]];if(q)return q(g,l,h,m)}}},r=n.match.POS;for(var u in n.match){n.match[u]=new RegExp(n.match[u].source+/(?![^\[]*\])(?![^\(]*\))/.source);n.leftMatch[u]=new RegExp(/(^(?:.|\r|\n)*?)/.source+n.match[u].source.replace(/\\(\d+)/g,function(g,
|
|
||||||
h){return"\\"+(h-0+1)}))}var z=function(g,h){g=Array.prototype.slice.call(g,0);if(h){h.push.apply(h,g);return h}return g};try{Array.prototype.slice.call(s.documentElement.childNodes,0)}catch(C){z=function(g,h){h=h||[];if(j.call(g)==="[object Array]")Array.prototype.push.apply(h,g);else if(typeof g.length==="number")for(var l=0,m=g.length;l<m;l++)h.push(g[l]);else for(l=0;g[l];l++)h.push(g[l]);return h}}var B;if(s.documentElement.compareDocumentPosition)B=function(g,h){if(!g.compareDocumentPosition||
|
|
||||||
!h.compareDocumentPosition){if(g==h)i=true;return g.compareDocumentPosition?-1:1}g=g.compareDocumentPosition(h)&4?-1:g===h?0:1;if(g===0)i=true;return g};else if("sourceIndex"in s.documentElement)B=function(g,h){if(!g.sourceIndex||!h.sourceIndex){if(g==h)i=true;return g.sourceIndex?-1:1}g=g.sourceIndex-h.sourceIndex;if(g===0)i=true;return g};else if(s.createRange)B=function(g,h){if(!g.ownerDocument||!h.ownerDocument){if(g==h)i=true;return g.ownerDocument?-1:1}var l=g.ownerDocument.createRange(),m=
|
|
||||||
h.ownerDocument.createRange();l.setStart(g,0);l.setEnd(g,0);m.setStart(h,0);m.setEnd(h,0);g=l.compareBoundaryPoints(Range.START_TO_END,m);if(g===0)i=true;return g};(function(){var g=s.createElement("div"),h="script"+(new Date).getTime();g.innerHTML="<a name='"+h+"'/>";var l=s.documentElement;l.insertBefore(g,l.firstChild);if(s.getElementById(h)){n.find.ID=function(m,q,p){if(typeof q.getElementById!=="undefined"&&!p)return(q=q.getElementById(m[1]))?q.id===m[1]||typeof q.getAttributeNode!=="undefined"&&
|
|
||||||
q.getAttributeNode("id").nodeValue===m[1]?[q]:w:[]};n.filter.ID=function(m,q){var p=typeof m.getAttributeNode!=="undefined"&&m.getAttributeNode("id");return m.nodeType===1&&p&&p.nodeValue===q}}l.removeChild(g);l=g=null})();(function(){var g=s.createElement("div");g.appendChild(s.createComment(""));if(g.getElementsByTagName("*").length>0)n.find.TAG=function(h,l){l=l.getElementsByTagName(h[1]);if(h[1]==="*"){h=[];for(var m=0;l[m];m++)l[m].nodeType===1&&h.push(l[m]);l=h}return l};g.innerHTML="<a href='#'></a>";
|
|
||||||
if(g.firstChild&&typeof g.firstChild.getAttribute!=="undefined"&&g.firstChild.getAttribute("href")!=="#")n.attrHandle.href=function(h){return h.getAttribute("href",2)};g=null})();s.querySelectorAll&&function(){var g=k,h=s.createElement("div");h.innerHTML="<p class='TEST'></p>";if(!(h.querySelectorAll&&h.querySelectorAll(".TEST").length===0)){k=function(m,q,p,v){q=q||s;if(!v&&q.nodeType===9&&!x(q))try{return z(q.querySelectorAll(m),p)}catch(t){}return g(m,q,p,v)};for(var l in g)k[l]=g[l];h=null}}();
|
|
||||||
(function(){var g=s.createElement("div");g.innerHTML="<div class='test e'></div><div class='test'></div>";if(!(!g.getElementsByClassName||g.getElementsByClassName("e").length===0)){g.lastChild.className="e";if(g.getElementsByClassName("e").length!==1){n.order.splice(1,0,"CLASS");n.find.CLASS=function(h,l,m){if(typeof l.getElementsByClassName!=="undefined"&&!m)return l.getElementsByClassName(h[1])};g=null}}})();var E=s.compareDocumentPosition?function(g,h){return!!(g.compareDocumentPosition(h)&16)}:
|
|
||||||
function(g,h){return g!==h&&(g.contains?g.contains(h):true)},x=function(g){return(g=(g?g.ownerDocument||g:0).documentElement)?g.nodeName!=="HTML":false},ga=function(g,h){var l=[],m="",q;for(h=h.nodeType?[h]:h;q=n.match.PSEUDO.exec(g);){m+=q[0];g=g.replace(n.match.PSEUDO,"")}g=n.relative[g]?g+"*":g;q=0;for(var p=h.length;q<p;q++)k(g,h[q],l);return k.filter(m,l)};c.find=k;c.expr=k.selectors;c.expr[":"]=c.expr.filters;c.unique=k.uniqueSort;c.text=a;c.isXMLDoc=x;c.contains=E})();var eb=/Until$/,fb=/^(?:parents|prevUntil|prevAll)/,
|
|
||||||
gb=/,/;R=Array.prototype.slice;var Ia=function(a,b,d){if(c.isFunction(b))return c.grep(a,function(e,j){return!!b.call(e,j,e)===d});else if(b.nodeType)return c.grep(a,function(e){return e===b===d});else if(typeof b==="string"){var f=c.grep(a,function(e){return e.nodeType===1});if(Ua.test(b))return c.filter(b,f,!d);else b=c.filter(b,f)}return c.grep(a,function(e){return c.inArray(e,b)>=0===d})};c.fn.extend({find:function(a){for(var b=this.pushStack("","find",a),d=0,f=0,e=this.length;f<e;f++){d=b.length;
|
|
||||||
c.find(a,this[f],b);if(f>0)for(var j=d;j<b.length;j++)for(var i=0;i<d;i++)if(b[i]===b[j]){b.splice(j--,1);break}}return b},has:function(a){var b=c(a);return this.filter(function(){for(var d=0,f=b.length;d<f;d++)if(c.contains(this,b[d]))return true})},not:function(a){return this.pushStack(Ia(this,a,false),"not",a)},filter:function(a){return this.pushStack(Ia(this,a,true),"filter",a)},is:function(a){return!!a&&c.filter(a,this).length>0},closest:function(a,b){if(c.isArray(a)){var d=[],f=this[0],e,j=
|
|
||||||
{},i;if(f&&a.length){e=0;for(var o=a.length;e<o;e++){i=a[e];j[i]||(j[i]=c.expr.match.POS.test(i)?c(i,b||this.context):i)}for(;f&&f.ownerDocument&&f!==b;){for(i in j){e=j[i];if(e.jquery?e.index(f)>-1:c(f).is(e)){d.push({selector:i,elem:f});delete j[i]}}f=f.parentNode}}return d}var k=c.expr.match.POS.test(a)?c(a,b||this.context):null;return this.map(function(n,r){for(;r&&r.ownerDocument&&r!==b;){if(k?k.index(r)>-1:c(r).is(a))return r;r=r.parentNode}return null})},index:function(a){if(!a||typeof a===
|
|
||||||
"string")return c.inArray(this[0],a?c(a):this.parent().children());return c.inArray(a.jquery?a[0]:a,this)},add:function(a,b){a=typeof a==="string"?c(a,b||this.context):c.makeArray(a);b=c.merge(this.get(),a);return this.pushStack(qa(a[0])||qa(b[0])?b:c.unique(b))},andSelf:function(){return this.add(this.prevObject)}});c.each({parent:function(a){return(a=a.parentNode)&&a.nodeType!==11?a:null},parents:function(a){return c.dir(a,"parentNode")},parentsUntil:function(a,b,d){return c.dir(a,"parentNode",
|
|
||||||
d)},next:function(a){return c.nth(a,2,"nextSibling")},prev:function(a){return c.nth(a,2,"previousSibling")},nextAll:function(a){return c.dir(a,"nextSibling")},prevAll:function(a){return c.dir(a,"previousSibling")},nextUntil:function(a,b,d){return c.dir(a,"nextSibling",d)},prevUntil:function(a,b,d){return c.dir(a,"previousSibling",d)},siblings:function(a){return c.sibling(a.parentNode.firstChild,a)},children:function(a){return c.sibling(a.firstChild)},contents:function(a){return c.nodeName(a,"iframe")?
|
|
||||||
a.contentDocument||a.contentWindow.document:c.makeArray(a.childNodes)}},function(a,b){c.fn[a]=function(d,f){var e=c.map(this,b,d);eb.test(a)||(f=d);if(f&&typeof f==="string")e=c.filter(f,e);e=this.length>1?c.unique(e):e;if((this.length>1||gb.test(f))&&fb.test(a))e=e.reverse();return this.pushStack(e,a,R.call(arguments).join(","))}});c.extend({filter:function(a,b,d){if(d)a=":not("+a+")";return c.find.matches(a,b)},dir:function(a,b,d){var f=[];for(a=a[b];a&&a.nodeType!==9&&(d===w||a.nodeType!==1||!c(a).is(d));){a.nodeType===
|
|
||||||
1&&f.push(a);a=a[b]}return f},nth:function(a,b,d){b=b||1;for(var f=0;a;a=a[d])if(a.nodeType===1&&++f===b)break;return a},sibling:function(a,b){for(var d=[];a;a=a.nextSibling)a.nodeType===1&&a!==b&&d.push(a);return d}});var Ja=/ jQuery\d+="(?:\d+|null)"/g,V=/^\s+/,Ka=/(<([\w:]+)[^>]*?)\/>/g,hb=/^(?:area|br|col|embed|hr|img|input|link|meta|param)$/i,La=/<([\w:]+)/,ib=/<tbody/i,jb=/<|&#?\w+;/,ta=/<script|<object|<embed|<option|<style/i,ua=/checked\s*(?:[^=]|=\s*.checked.)/i,Ma=function(a,b,d){return hb.test(d)?
|
|
||||||
a:b+"></"+d+">"},F={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]};F.optgroup=F.option;F.tbody=F.tfoot=F.colgroup=F.caption=F.thead;F.th=F.td;if(!c.support.htmlSerialize)F._default=[1,"div<div>","</div>"];c.fn.extend({text:function(a){if(c.isFunction(a))return this.each(function(b){var d=
|
|
||||||
c(this);d.text(a.call(this,b,d.text()))});if(typeof a!=="object"&&a!==w)return this.empty().append((this[0]&&this[0].ownerDocument||s).createTextNode(a));return c.text(this)},wrapAll:function(a){if(c.isFunction(a))return this.each(function(d){c(this).wrapAll(a.call(this,d))});if(this[0]){var b=c(a,this[0].ownerDocument).eq(0).clone(true);this[0].parentNode&&b.insertBefore(this[0]);b.map(function(){for(var d=this;d.firstChild&&d.firstChild.nodeType===1;)d=d.firstChild;return d}).append(this)}return this},
|
|
||||||
wrapInner:function(a){if(c.isFunction(a))return this.each(function(b){c(this).wrapInner(a.call(this,b))});return this.each(function(){var b=c(this),d=b.contents();d.length?d.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){c(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){c.nodeName(this,"body")||c(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.appendChild(a)})},
|
|
||||||
prepend:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,this)});else if(arguments.length){var a=c(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,
|
|
||||||
this.nextSibling)});else if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,c(arguments[0]).toArray());return a}},remove:function(a,b){for(var d=0,f;(f=this[d])!=null;d++)if(!a||c.filter(a,[f]).length){if(!b&&f.nodeType===1){c.cleanData(f.getElementsByTagName("*"));c.cleanData([f])}f.parentNode&&f.parentNode.removeChild(f)}return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++)for(b.nodeType===1&&c.cleanData(b.getElementsByTagName("*"));b.firstChild;)b.removeChild(b.firstChild);
|
|
||||||
return this},clone:function(a){var b=this.map(function(){if(!c.support.noCloneEvent&&!c.isXMLDoc(this)){var d=this.outerHTML,f=this.ownerDocument;if(!d){d=f.createElement("div");d.appendChild(this.cloneNode(true));d=d.innerHTML}return c.clean([d.replace(Ja,"").replace(/=([^="'>\s]+\/)>/g,'="$1">').replace(V,"")],f)[0]}else return this.cloneNode(true)});if(a===true){ra(this,b);ra(this.find("*"),b.find("*"))}return b},html:function(a){if(a===w)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(Ja,
|
|
||||||
""):null;else if(typeof a==="string"&&!ta.test(a)&&(c.support.leadingWhitespace||!V.test(a))&&!F[(La.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Ka,Ma);try{for(var b=0,d=this.length;b<d;b++)if(this[b].nodeType===1){c.cleanData(this[b].getElementsByTagName("*"));this[b].innerHTML=a}}catch(f){this.empty().append(a)}}else c.isFunction(a)?this.each(function(e){var j=c(this),i=j.html();j.empty().append(function(){return a.call(this,e,i)})}):this.empty().append(a);return this},replaceWith:function(a){if(this[0]&&
|
|
||||||
this[0].parentNode){if(c.isFunction(a))return this.each(function(b){var d=c(this),f=d.html();d.replaceWith(a.call(this,b,f))});if(typeof a!=="string")a=c(a).detach();return this.each(function(){var b=this.nextSibling,d=this.parentNode;c(this).remove();b?c(b).before(a):c(d).append(a)})}else return this.pushStack(c(c.isFunction(a)?a():a),"replaceWith",a)},detach:function(a){return this.remove(a,true)},domManip:function(a,b,d){function f(u){return c.nodeName(u,"table")?u.getElementsByTagName("tbody")[0]||
|
|
||||||
u.appendChild(u.ownerDocument.createElement("tbody")):u}var e,j,i=a[0],o=[],k;if(!c.support.checkClone&&arguments.length===3&&typeof i==="string"&&ua.test(i))return this.each(function(){c(this).domManip(a,b,d,true)});if(c.isFunction(i))return this.each(function(u){var z=c(this);a[0]=i.call(this,u,b?z.html():w);z.domManip(a,b,d)});if(this[0]){e=i&&i.parentNode;e=c.support.parentNode&&e&&e.nodeType===11&&e.childNodes.length===this.length?{fragment:e}:sa(a,this,o);k=e.fragment;if(j=k.childNodes.length===
|
|
||||||
1?(k=k.firstChild):k.firstChild){b=b&&c.nodeName(j,"tr");for(var n=0,r=this.length;n<r;n++)d.call(b?f(this[n],j):this[n],n>0||e.cacheable||this.length>1?k.cloneNode(true):k)}o.length&&c.each(o,Qa)}return this}});c.fragments={};c.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){c.fn[a]=function(d){var f=[];d=c(d);var e=this.length===1&&this[0].parentNode;if(e&&e.nodeType===11&&e.childNodes.length===1&&d.length===1){d[b](this[0]);
|
|
||||||
return this}else{e=0;for(var j=d.length;e<j;e++){var i=(e>0?this.clone(true):this).get();c.fn[b].apply(c(d[e]),i);f=f.concat(i)}return this.pushStack(f,a,d.selector)}}});c.extend({clean:function(a,b,d,f){b=b||s;if(typeof b.createElement==="undefined")b=b.ownerDocument||b[0]&&b[0].ownerDocument||s;for(var e=[],j=0,i;(i=a[j])!=null;j++){if(typeof i==="number")i+="";if(i){if(typeof i==="string"&&!jb.test(i))i=b.createTextNode(i);else if(typeof i==="string"){i=i.replace(Ka,Ma);var o=(La.exec(i)||["",
|
|
||||||
""])[1].toLowerCase(),k=F[o]||F._default,n=k[0],r=b.createElement("div");for(r.innerHTML=k[1]+i+k[2];n--;)r=r.lastChild;if(!c.support.tbody){n=ib.test(i);o=o==="table"&&!n?r.firstChild&&r.firstChild.childNodes:k[1]==="<table>"&&!n?r.childNodes:[];for(k=o.length-1;k>=0;--k)c.nodeName(o[k],"tbody")&&!o[k].childNodes.length&&o[k].parentNode.removeChild(o[k])}!c.support.leadingWhitespace&&V.test(i)&&r.insertBefore(b.createTextNode(V.exec(i)[0]),r.firstChild);i=r.childNodes}if(i.nodeType)e.push(i);else e=
|
|
||||||
c.merge(e,i)}}if(d)for(j=0;e[j];j++)if(f&&c.nodeName(e[j],"script")&&(!e[j].type||e[j].type.toLowerCase()==="text/javascript"))f.push(e[j].parentNode?e[j].parentNode.removeChild(e[j]):e[j]);else{e[j].nodeType===1&&e.splice.apply(e,[j+1,0].concat(c.makeArray(e[j].getElementsByTagName("script"))));d.appendChild(e[j])}return e},cleanData:function(a){for(var b,d,f=c.cache,e=c.event.special,j=c.support.deleteExpando,i=0,o;(o=a[i])!=null;i++)if(d=o[c.expando]){b=f[d];if(b.events)for(var k in b.events)e[k]?
|
|
||||||
c.event.remove(o,k):Ca(o,k,b.handle);if(j)delete o[c.expando];else o.removeAttribute&&o.removeAttribute(c.expando);delete f[d]}}});var kb=/z-?index|font-?weight|opacity|zoom|line-?height/i,Na=/alpha\([^)]*\)/,Oa=/opacity=([^)]*)/,ha=/float/i,ia=/-([a-z])/ig,lb=/([A-Z])/g,mb=/^-?\d+(?:px)?$/i,nb=/^-?\d/,ob={position:"absolute",visibility:"hidden",display:"block"},pb=["Left","Right"],qb=["Top","Bottom"],rb=s.defaultView&&s.defaultView.getComputedStyle,Pa=c.support.cssFloat?"cssFloat":"styleFloat",ja=
|
|
||||||
function(a,b){return b.toUpperCase()};c.fn.css=function(a,b){return X(this,a,b,true,function(d,f,e){if(e===w)return c.curCSS(d,f);if(typeof e==="number"&&!kb.test(f))e+="px";c.style(d,f,e)})};c.extend({style:function(a,b,d){if(!a||a.nodeType===3||a.nodeType===8)return w;if((b==="width"||b==="height")&&parseFloat(d)<0)d=w;var f=a.style||a,e=d!==w;if(!c.support.opacity&&b==="opacity"){if(e){f.zoom=1;b=parseInt(d,10)+""==="NaN"?"":"alpha(opacity="+d*100+")";a=f.filter||c.curCSS(a,"filter")||"";f.filter=
|
|
||||||
Na.test(a)?a.replace(Na,b):b}return f.filter&&f.filter.indexOf("opacity=")>=0?parseFloat(Oa.exec(f.filter)[1])/100+"":""}if(ha.test(b))b=Pa;b=b.replace(ia,ja);if(e)f[b]=d;return f[b]},css:function(a,b,d,f){if(b==="width"||b==="height"){var e,j=b==="width"?pb:qb;function i(){e=b==="width"?a.offsetWidth:a.offsetHeight;f!=="border"&&c.each(j,function(){f||(e-=parseFloat(c.curCSS(a,"padding"+this,true))||0);if(f==="margin")e+=parseFloat(c.curCSS(a,"margin"+this,true))||0;else e-=parseFloat(c.curCSS(a,
|
|
||||||
"border"+this+"Width",true))||0})}a.offsetWidth!==0?i():c.swap(a,ob,i);return Math.max(0,Math.round(e))}return c.curCSS(a,b,d)},curCSS:function(a,b,d){var f,e=a.style;if(!c.support.opacity&&b==="opacity"&&a.currentStyle){f=Oa.test(a.currentStyle.filter||"")?parseFloat(RegExp.$1)/100+"":"";return f===""?"1":f}if(ha.test(b))b=Pa;if(!d&&e&&e[b])f=e[b];else if(rb){if(ha.test(b))b="float";b=b.replace(lb,"-$1").toLowerCase();e=a.ownerDocument.defaultView;if(!e)return null;if(a=e.getComputedStyle(a,null))f=
|
|
||||||
a.getPropertyValue(b);if(b==="opacity"&&f==="")f="1"}else if(a.currentStyle){d=b.replace(ia,ja);f=a.currentStyle[b]||a.currentStyle[d];if(!mb.test(f)&&nb.test(f)){b=e.left;var j=a.runtimeStyle.left;a.runtimeStyle.left=a.currentStyle.left;e.left=d==="fontSize"?"1em":f||0;f=e.pixelLeft+"px";e.left=b;a.runtimeStyle.left=j}}return f},swap:function(a,b,d){var f={};for(var e in b){f[e]=a.style[e];a.style[e]=b[e]}d.call(a);for(e in b)a.style[e]=f[e]}});if(c.expr&&c.expr.filters){c.expr.filters.hidden=function(a){var b=
|
|
||||||
a.offsetWidth,d=a.offsetHeight,f=a.nodeName.toLowerCase()==="tr";return b===0&&d===0&&!f?true:b>0&&d>0&&!f?false:c.curCSS(a,"display")==="none"};c.expr.filters.visible=function(a){return!c.expr.filters.hidden(a)}}var sb=J(),tb=/<script(.|\s)*?\/script>/gi,ub=/select|textarea/i,vb=/color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week/i,N=/=\?(&|$)/,ka=/\?/,wb=/(\?|&)_=.*?(&|$)/,xb=/^(\w+:)?\/\/([^\/?#]+)/,yb=/%20/g,zb=c.fn.load;c.fn.extend({load:function(a,b,d){if(typeof a!==
|
|
||||||
"string")return zb.call(this,a);else if(!this.length)return this;var f=a.indexOf(" ");if(f>=0){var e=a.slice(f,a.length);a=a.slice(0,f)}f="GET";if(b)if(c.isFunction(b)){d=b;b=null}else if(typeof b==="object"){b=c.param(b,c.ajaxSettings.traditional);f="POST"}var j=this;c.ajax({url:a,type:f,dataType:"html",data:b,complete:function(i,o){if(o==="success"||o==="notmodified")j.html(e?c("<div />").append(i.responseText.replace(tb,"")).find(e):i.responseText);d&&j.each(d,[i.responseText,o,i])}});return this},
|
|
||||||
serialize:function(){return c.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?c.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||ub.test(this.nodeName)||vb.test(this.type))}).map(function(a,b){a=c(this).val();return a==null?null:c.isArray(a)?c.map(a,function(d){return{name:b.name,value:d}}):{name:b.name,value:a}}).get()}});c.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),
|
|
||||||
function(a,b){c.fn[b]=function(d){return this.bind(b,d)}});c.extend({get:function(a,b,d,f){if(c.isFunction(b)){f=f||d;d=b;b=null}return c.ajax({type:"GET",url:a,data:b,success:d,dataType:f})},getScript:function(a,b){return c.get(a,null,b,"script")},getJSON:function(a,b,d){return c.get(a,b,d,"json")},post:function(a,b,d,f){if(c.isFunction(b)){f=f||d;d=b;b={}}return c.ajax({type:"POST",url:a,data:b,success:d,dataType:f})},ajaxSetup:function(a){c.extend(c.ajaxSettings,a)},ajaxSettings:{url:location.href,
|
|
||||||
global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:A.XMLHttpRequest&&(A.location.protocol!=="file:"||!A.ActiveXObject)?function(){return new A.XMLHttpRequest}:function(){try{return new A.ActiveXObject("Microsoft.XMLHTTP")}catch(a){}},accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},etag:{},ajax:function(a){function b(){e.success&&
|
|
||||||
e.success.call(k,o,i,x);e.global&&f("ajaxSuccess",[x,e])}function d(){e.complete&&e.complete.call(k,x,i);e.global&&f("ajaxComplete",[x,e]);e.global&&!--c.active&&c.event.trigger("ajaxStop")}function f(q,p){(e.context?c(e.context):c.event).trigger(q,p)}var e=c.extend(true,{},c.ajaxSettings,a),j,i,o,k=a&&a.context||e,n=e.type.toUpperCase();if(e.data&&e.processData&&typeof e.data!=="string")e.data=c.param(e.data,e.traditional);if(e.dataType==="jsonp"){if(n==="GET")N.test(e.url)||(e.url+=(ka.test(e.url)?
|
|
||||||
"&":"?")+(e.jsonp||"callback")+"=?");else if(!e.data||!N.test(e.data))e.data=(e.data?e.data+"&":"")+(e.jsonp||"callback")+"=?";e.dataType="json"}if(e.dataType==="json"&&(e.data&&N.test(e.data)||N.test(e.url))){j=e.jsonpCallback||"jsonp"+sb++;if(e.data)e.data=(e.data+"").replace(N,"="+j+"$1");e.url=e.url.replace(N,"="+j+"$1");e.dataType="script";A[j]=A[j]||function(q){o=q;b();d();A[j]=w;try{delete A[j]}catch(p){}z&&z.removeChild(C)}}if(e.dataType==="script"&&e.cache===null)e.cache=false;if(e.cache===
|
|
||||||
false&&n==="GET"){var r=J(),u=e.url.replace(wb,"$1_="+r+"$2");e.url=u+(u===e.url?(ka.test(e.url)?"&":"?")+"_="+r:"")}if(e.data&&n==="GET")e.url+=(ka.test(e.url)?"&":"?")+e.data;e.global&&!c.active++&&c.event.trigger("ajaxStart");r=(r=xb.exec(e.url))&&(r[1]&&r[1]!==location.protocol||r[2]!==location.host);if(e.dataType==="script"&&n==="GET"&&r){var z=s.getElementsByTagName("head")[0]||s.documentElement,C=s.createElement("script");C.src=e.url;if(e.scriptCharset)C.charset=e.scriptCharset;if(!j){var B=
|
|
||||||
false;C.onload=C.onreadystatechange=function(){if(!B&&(!this.readyState||this.readyState==="loaded"||this.readyState==="complete")){B=true;b();d();C.onload=C.onreadystatechange=null;z&&C.parentNode&&z.removeChild(C)}}}z.insertBefore(C,z.firstChild);return w}var E=false,x=e.xhr();if(x){e.username?x.open(n,e.url,e.async,e.username,e.password):x.open(n,e.url,e.async);try{if(e.data||a&&a.contentType)x.setRequestHeader("Content-Type",e.contentType);if(e.ifModified){c.lastModified[e.url]&&x.setRequestHeader("If-Modified-Since",
|
|
||||||
c.lastModified[e.url]);c.etag[e.url]&&x.setRequestHeader("If-None-Match",c.etag[e.url])}r||x.setRequestHeader("X-Requested-With","XMLHttpRequest");x.setRequestHeader("Accept",e.dataType&&e.accepts[e.dataType]?e.accepts[e.dataType]+", */*":e.accepts._default)}catch(ga){}if(e.beforeSend&&e.beforeSend.call(k,x,e)===false){e.global&&!--c.active&&c.event.trigger("ajaxStop");x.abort();return false}e.global&&f("ajaxSend",[x,e]);var g=x.onreadystatechange=function(q){if(!x||x.readyState===0||q==="abort"){E||
|
|
||||||
d();E=true;if(x)x.onreadystatechange=c.noop}else if(!E&&x&&(x.readyState===4||q==="timeout")){E=true;x.onreadystatechange=c.noop;i=q==="timeout"?"timeout":!c.httpSuccess(x)?"error":e.ifModified&&c.httpNotModified(x,e.url)?"notmodified":"success";var p;if(i==="success")try{o=c.httpData(x,e.dataType,e)}catch(v){i="parsererror";p=v}if(i==="success"||i==="notmodified")j||b();else c.handleError(e,x,i,p);d();q==="timeout"&&x.abort();if(e.async)x=null}};try{var h=x.abort;x.abort=function(){x&&h.call(x);
|
|
||||||
g("abort")}}catch(l){}e.async&&e.timeout>0&&setTimeout(function(){x&&!E&&g("timeout")},e.timeout);try{x.send(n==="POST"||n==="PUT"||n==="DELETE"?e.data:null)}catch(m){c.handleError(e,x,null,m);d()}e.async||g();return x}},handleError:function(a,b,d,f){if(a.error)a.error.call(a.context||a,b,d,f);if(a.global)(a.context?c(a.context):c.event).trigger("ajaxError",[b,a,f])},active:0,httpSuccess:function(a){try{return!a.status&&location.protocol==="file:"||a.status>=200&&a.status<300||a.status===304||a.status===
|
|
||||||
1223||a.status===0}catch(b){}return false},httpNotModified:function(a,b){var d=a.getResponseHeader("Last-Modified"),f=a.getResponseHeader("Etag");if(d)c.lastModified[b]=d;if(f)c.etag[b]=f;return a.status===304||a.status===0},httpData:function(a,b,d){var f=a.getResponseHeader("content-type")||"",e=b==="xml"||!b&&f.indexOf("xml")>=0;a=e?a.responseXML:a.responseText;e&&a.documentElement.nodeName==="parsererror"&&c.error("parsererror");if(d&&d.dataFilter)a=d.dataFilter(a,b);if(typeof a==="string")if(b===
|
|
||||||
"json"||!b&&f.indexOf("json")>=0)a=c.parseJSON(a);else if(b==="script"||!b&&f.indexOf("javascript")>=0)c.globalEval(a);return a},param:function(a,b){function d(i,o){if(c.isArray(o))c.each(o,function(k,n){b||/\[\]$/.test(i)?f(i,n):d(i+"["+(typeof n==="object"||c.isArray(n)?k:"")+"]",n)});else!b&&o!=null&&typeof o==="object"?c.each(o,function(k,n){d(i+"["+k+"]",n)}):f(i,o)}function f(i,o){o=c.isFunction(o)?o():o;e[e.length]=encodeURIComponent(i)+"="+encodeURIComponent(o)}var e=[];if(b===w)b=c.ajaxSettings.traditional;
|
|
||||||
if(c.isArray(a)||a.jquery)c.each(a,function(){f(this.name,this.value)});else for(var j in a)d(j,a[j]);return e.join("&").replace(yb,"+")}});var la={},Ab=/toggle|show|hide/,Bb=/^([+-]=)?([\d+-.]+)(.*)$/,W,va=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];c.fn.extend({show:function(a,b){if(a||a===0)return this.animate(K("show",3),a,b);else{a=0;for(b=this.length;a<b;a++){var d=c.data(this[a],"olddisplay");
|
|
||||||
this[a].style.display=d||"";if(c.css(this[a],"display")==="none"){d=this[a].nodeName;var f;if(la[d])f=la[d];else{var e=c("<"+d+" />").appendTo("body");f=e.css("display");if(f==="none")f="block";e.remove();la[d]=f}c.data(this[a],"olddisplay",f)}}a=0;for(b=this.length;a<b;a++)this[a].style.display=c.data(this[a],"olddisplay")||"";return this}},hide:function(a,b){if(a||a===0)return this.animate(K("hide",3),a,b);else{a=0;for(b=this.length;a<b;a++){var d=c.data(this[a],"olddisplay");!d&&d!=="none"&&c.data(this[a],
|
|
||||||
"olddisplay",c.css(this[a],"display"))}a=0;for(b=this.length;a<b;a++)this[a].style.display="none";return this}},_toggle:c.fn.toggle,toggle:function(a,b){var d=typeof a==="boolean";if(c.isFunction(a)&&c.isFunction(b))this._toggle.apply(this,arguments);else a==null||d?this.each(function(){var f=d?a:c(this).is(":hidden");c(this)[f?"show":"hide"]()}):this.animate(K("toggle",3),a,b);return this},fadeTo:function(a,b,d){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:b},a,d)},
|
|
||||||
animate:function(a,b,d,f){var e=c.speed(b,d,f);if(c.isEmptyObject(a))return this.each(e.complete);return this[e.queue===false?"each":"queue"](function(){var j=c.extend({},e),i,o=this.nodeType===1&&c(this).is(":hidden"),k=this;for(i in a){var n=i.replace(ia,ja);if(i!==n){a[n]=a[i];delete a[i];i=n}if(a[i]==="hide"&&o||a[i]==="show"&&!o)return j.complete.call(this);if((i==="height"||i==="width")&&this.style){j.display=c.css(this,"display");j.overflow=this.style.overflow}if(c.isArray(a[i])){(j.specialEasing=
|
|
||||||
j.specialEasing||{})[i]=a[i][1];a[i]=a[i][0]}}if(j.overflow!=null)this.style.overflow="hidden";j.curAnim=c.extend({},a);c.each(a,function(r,u){var z=new c.fx(k,j,r);if(Ab.test(u))z[u==="toggle"?o?"show":"hide":u](a);else{var C=Bb.exec(u),B=z.cur(true)||0;if(C){u=parseFloat(C[2]);var E=C[3]||"px";if(E!=="px"){k.style[r]=(u||1)+E;B=(u||1)/z.cur(true)*B;k.style[r]=B+E}if(C[1])u=(C[1]==="-="?-1:1)*u+B;z.custom(B,u,E)}else z.custom(B,u,"")}});return true})},stop:function(a,b){var d=c.timers;a&&this.queue([]);
|
|
||||||
this.each(function(){for(var f=d.length-1;f>=0;f--)if(d[f].elem===this){b&&d[f](true);d.splice(f,1)}});b||this.dequeue();return this}});c.each({slideDown:K("show",1),slideUp:K("hide",1),slideToggle:K("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"}},function(a,b){c.fn[a]=function(d,f){return this.animate(b,d,f)}});c.extend({speed:function(a,b,d){var f=a&&typeof a==="object"?a:{complete:d||!d&&b||c.isFunction(a)&&a,duration:a,easing:d&&b||b&&!c.isFunction(b)&&b};f.duration=c.fx.off?0:typeof f.duration===
|
|
||||||
"number"?f.duration:c.fx.speeds[f.duration]||c.fx.speeds._default;f.old=f.complete;f.complete=function(){f.queue!==false&&c(this).dequeue();c.isFunction(f.old)&&f.old.call(this)};return f},easing:{linear:function(a,b,d,f){return d+f*a},swing:function(a,b,d,f){return(-Math.cos(a*Math.PI)/2+0.5)*f+d}},timers:[],fx:function(a,b,d){this.options=b;this.elem=a;this.prop=d;if(!b.orig)b.orig={}}});c.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this);(c.fx.step[this.prop]||
|
|
||||||
c.fx.step._default)(this);if((this.prop==="height"||this.prop==="width")&&this.elem.style)this.elem.style.display="block"},cur:function(a){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];return(a=parseFloat(c.css(this.elem,this.prop,a)))&&a>-10000?a:parseFloat(c.curCSS(this.elem,this.prop))||0},custom:function(a,b,d){function f(j){return e.step(j)}this.startTime=J();this.start=a;this.end=b;this.unit=d||this.unit||"px";this.now=this.start;
|
|
||||||
this.pos=this.state=0;var e=this;f.elem=this.elem;if(f()&&c.timers.push(f)&&!W)W=setInterval(c.fx.tick,13)},show:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.show=true;this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur());c(this.elem).show()},hide:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.hide=true;this.custom(this.cur(),0)},step:function(a){var b=J(),d=true;if(a||b>=this.options.duration+this.startTime){this.now=
|
|
||||||
this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;for(var f in this.options.curAnim)if(this.options.curAnim[f]!==true)d=false;if(d){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;a=c.data(this.elem,"olddisplay");this.elem.style.display=a?a:this.options.display;if(c.css(this.elem,"display")==="none")this.elem.style.display="block"}this.options.hide&&c(this.elem).hide();if(this.options.hide||this.options.show)for(var e in this.options.curAnim)c.style(this.elem,
|
|
||||||
e,this.options.orig[e]);this.options.complete.call(this.elem)}return false}else{e=b-this.startTime;this.state=e/this.options.duration;a=this.options.easing||(c.easing.swing?"swing":"linear");this.pos=c.easing[this.options.specialEasing&&this.options.specialEasing[this.prop]||a](this.state,e,0,1,this.options.duration);this.now=this.start+(this.end-this.start)*this.pos;this.update()}return true}};c.extend(c.fx,{tick:function(){for(var a=c.timers,b=0;b<a.length;b++)a[b]()||a.splice(b--,1);a.length||
|
|
||||||
c.fx.stop()},stop:function(){clearInterval(W);W=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(a){c.style(a.elem,"opacity",a.now)},_default:function(a){if(a.elem.style&&a.elem.style[a.prop]!=null)a.elem.style[a.prop]=(a.prop==="width"||a.prop==="height"?Math.max(0,a.now):a.now)+a.unit;else a.elem[a.prop]=a.now}}});if(c.expr&&c.expr.filters)c.expr.filters.animated=function(a){return c.grep(c.timers,function(b){return a===b.elem}).length};c.fn.offset="getBoundingClientRect"in s.documentElement?
|
|
||||||
function(a){var b=this[0];if(a)return this.each(function(e){c.offset.setOffset(this,a,e)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return c.offset.bodyOffset(b);var d=b.getBoundingClientRect(),f=b.ownerDocument;b=f.body;f=f.documentElement;return{top:d.top+(self.pageYOffset||c.support.boxModel&&f.scrollTop||b.scrollTop)-(f.clientTop||b.clientTop||0),left:d.left+(self.pageXOffset||c.support.boxModel&&f.scrollLeft||b.scrollLeft)-(f.clientLeft||b.clientLeft||0)}}:function(a){var b=
|
|
||||||
this[0];if(a)return this.each(function(r){c.offset.setOffset(this,a,r)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return c.offset.bodyOffset(b);c.offset.initialize();var d=b.offsetParent,f=b,e=b.ownerDocument,j,i=e.documentElement,o=e.body;f=(e=e.defaultView)?e.getComputedStyle(b,null):b.currentStyle;for(var k=b.offsetTop,n=b.offsetLeft;(b=b.parentNode)&&b!==o&&b!==i;){if(c.offset.supportsFixedPosition&&f.position==="fixed")break;j=e?e.getComputedStyle(b,null):b.currentStyle;
|
|
||||||
k-=b.scrollTop;n-=b.scrollLeft;if(b===d){k+=b.offsetTop;n+=b.offsetLeft;if(c.offset.doesNotAddBorder&&!(c.offset.doesAddBorderForTableAndCells&&/^t(able|d|h)$/i.test(b.nodeName))){k+=parseFloat(j.borderTopWidth)||0;n+=parseFloat(j.borderLeftWidth)||0}f=d;d=b.offsetParent}if(c.offset.subtractsBorderForOverflowNotVisible&&j.overflow!=="visible"){k+=parseFloat(j.borderTopWidth)||0;n+=parseFloat(j.borderLeftWidth)||0}f=j}if(f.position==="relative"||f.position==="static"){k+=o.offsetTop;n+=o.offsetLeft}if(c.offset.supportsFixedPosition&&
|
|
||||||
f.position==="fixed"){k+=Math.max(i.scrollTop,o.scrollTop);n+=Math.max(i.scrollLeft,o.scrollLeft)}return{top:k,left:n}};c.offset={initialize:function(){var a=s.body,b=s.createElement("div"),d,f,e,j=parseFloat(c.curCSS(a,"marginTop",true))||0;c.extend(b.style,{position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"});b.innerHTML="<div style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;'><div></div></div><table style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;' cellpadding='0' cellspacing='0'><tr><td></td></tr></table>";
|
|
||||||
a.insertBefore(b,a.firstChild);d=b.firstChild;f=d.firstChild;e=d.nextSibling.firstChild.firstChild;this.doesNotAddBorder=f.offsetTop!==5;this.doesAddBorderForTableAndCells=e.offsetTop===5;f.style.position="fixed";f.style.top="20px";this.supportsFixedPosition=f.offsetTop===20||f.offsetTop===15;f.style.position=f.style.top="";d.style.overflow="hidden";d.style.position="relative";this.subtractsBorderForOverflowNotVisible=f.offsetTop===-5;this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==j;a.removeChild(b);
|
|
||||||
c.offset.initialize=c.noop},bodyOffset:function(a){var b=a.offsetTop,d=a.offsetLeft;c.offset.initialize();if(c.offset.doesNotIncludeMarginInBodyOffset){b+=parseFloat(c.curCSS(a,"marginTop",true))||0;d+=parseFloat(c.curCSS(a,"marginLeft",true))||0}return{top:b,left:d}},setOffset:function(a,b,d){if(/static/.test(c.curCSS(a,"position")))a.style.position="relative";var f=c(a),e=f.offset(),j=parseInt(c.curCSS(a,"top",true),10)||0,i=parseInt(c.curCSS(a,"left",true),10)||0;if(c.isFunction(b))b=b.call(a,
|
|
||||||
d,e);d={top:b.top-e.top+j,left:b.left-e.left+i};"using"in b?b.using.call(a,d):f.css(d)}};c.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),d=this.offset(),f=/^body|html$/i.test(b[0].nodeName)?{top:0,left:0}:b.offset();d.top-=parseFloat(c.curCSS(a,"marginTop",true))||0;d.left-=parseFloat(c.curCSS(a,"marginLeft",true))||0;f.top+=parseFloat(c.curCSS(b[0],"borderTopWidth",true))||0;f.left+=parseFloat(c.curCSS(b[0],"borderLeftWidth",true))||0;return{top:d.top-
|
|
||||||
f.top,left:d.left-f.left}},offsetParent:function(){return this.map(function(){for(var a=this.offsetParent||s.body;a&&!/^body|html$/i.test(a.nodeName)&&c.css(a,"position")==="static";)a=a.offsetParent;return a})}});c.each(["Left","Top"],function(a,b){var d="scroll"+b;c.fn[d]=function(f){var e=this[0],j;if(!e)return null;if(f!==w)return this.each(function(){if(j=wa(this))j.scrollTo(!a?f:c(j).scrollLeft(),a?f:c(j).scrollTop());else this[d]=f});else return(j=wa(e))?"pageXOffset"in j?j[a?"pageYOffset":
|
|
||||||
"pageXOffset"]:c.support.boxModel&&j.document.documentElement[d]||j.document.body[d]:e[d]}});c.each(["Height","Width"],function(a,b){var d=b.toLowerCase();c.fn["inner"+b]=function(){return this[0]?c.css(this[0],d,false,"padding"):null};c.fn["outer"+b]=function(f){return this[0]?c.css(this[0],d,false,f?"margin":"border"):null};c.fn[d]=function(f){var e=this[0];if(!e)return f==null?null:this;if(c.isFunction(f))return this.each(function(j){var i=c(this);i[d](f.call(this,j,i[d]()))});return"scrollTo"in
|
|
||||||
e&&e.document?e.document.compatMode==="CSS1Compat"&&e.document.documentElement["client"+b]||e.document.body["client"+b]:e.nodeType===9?Math.max(e.documentElement["client"+b],e.body["scroll"+b],e.documentElement["scroll"+b],e.body["offset"+b],e.documentElement["offset"+b]):f===w?c.css(e,d):this.css(d,typeof f==="string"?f:f+"px")}});A.jQuery=A.$=c})(window);
|
|
37
src/mibew/js/source/bans.js
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
/*!
|
||||||
|
* This file is a part of Mibew Messenger.
|
||||||
|
*
|
||||||
|
* Copyright 2005-2023 the original author or authors.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
(function(Mibew, $) {
|
||||||
|
$(document).ready(function() {
|
||||||
|
$('a.remove-link').click(function() {
|
||||||
|
var url = $(this).attr('href'),
|
||||||
|
message = Mibew.Localization.trans(
|
||||||
|
'Are you sure that you want to delete address {0} from the blocked list?',
|
||||||
|
$(this).data('ban-address')
|
||||||
|
);
|
||||||
|
|
||||||
|
Mibew.Utils.confirm(message, function(value) {
|
||||||
|
if (value) {
|
||||||
|
window.location.href = url;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
return false;
|
||||||
|
});
|
||||||
|
});
|
||||||
|
})(Mibew, jQuery);
|
@ -1,30 +0,0 @@
|
|||||||
var myAgent = "";
|
|
||||||
var myVer = 0;
|
|
||||||
var myRealAgent = "";
|
|
||||||
|
|
||||||
function detectAgent() {
|
|
||||||
var AGENTS = ["opera","msie","safari","firefox","netscape","mozilla"];
|
|
||||||
var agent = navigator.userAgent.toLowerCase();
|
|
||||||
for (var i = 0; i < AGENTS.length; i++) {
|
|
||||||
var agentStr = AGENTS[i];
|
|
||||||
if (agent.indexOf(agentStr) != -1) {
|
|
||||||
myAgent = agentStr;
|
|
||||||
if (!window.RegExp)
|
|
||||||
break;
|
|
||||||
|
|
||||||
var versionExpr = new RegExp(agentStr + "[ \/]?([0-9]+(\.[0-9]+)?)");
|
|
||||||
if (versionExpr.exec(agent) != null) {
|
|
||||||
myVer = parseFloat(RegExp.$1);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
myRealAgent = myAgent;
|
|
||||||
if( navigator.product == "Gecko")
|
|
||||||
myAgent = "moz";
|
|
||||||
}
|
|
||||||
detectAgent();
|
|
||||||
|
|
||||||
function getEl(name) {
|
|
||||||
return document.getElementById(name);
|
|
||||||
}
|
|
@ -1,34 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
|
|
||||||
<project basedir="." default="update" name="Obfuscator">
|
|
||||||
<property name="closure.c" value="/usr/local/closure/compiler.jar" />
|
|
||||||
<property name="mibew.location" value="../1611" />
|
|
||||||
|
|
||||||
<target name="update">
|
|
||||||
<java jar="${closure.c}" fork="true">
|
|
||||||
<arg value="--module_output_path_prefix"/>
|
|
||||||
<arg value="${mibew.location}/"/>
|
|
||||||
<arg value="--module"/>
|
|
||||||
<arg value="common:1"/>
|
|
||||||
<arg value="--js"/>
|
|
||||||
<arg value="common.js"/>
|
|
||||||
<arg value="--module"/>
|
|
||||||
<arg value="chat:1:common"/>
|
|
||||||
<arg value="--js"/>
|
|
||||||
<arg value="chat.js"/>
|
|
||||||
<arg value="--module"/>
|
|
||||||
<arg value="users:1:common"/>
|
|
||||||
<arg value="--js"/>
|
|
||||||
<arg value="users.js"/>
|
|
||||||
<arg value="--module"/>
|
|
||||||
<arg value="brws:1:common"/>
|
|
||||||
<arg value="--js"/>
|
|
||||||
<arg value="brws.js"/>
|
|
||||||
<arg value="--module"/>
|
|
||||||
<arg value="soundcheck:1:common"/>
|
|
||||||
<arg value="--js"/>
|
|
||||||
<arg value="soundcheck.js"/>
|
|
||||||
</java>
|
|
||||||
</target>
|
|
||||||
|
|
||||||
</project>
|
|
@ -1,6 +1,7 @@
|
|||||||
<?php
|
/*!
|
||||||
/*
|
* This file is a part of Mibew Messenger.
|
||||||
* Copyright 2005-2014 the original author or authors.
|
*
|
||||||
|
* Copyright 2005-2023 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@ -15,17 +16,11 @@
|
|||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
require_once('../libs/common.php');
|
(function(Mibew, $) {
|
||||||
require_once('../libs/operator.php');
|
$(document).ready(function(){
|
||||||
|
$('#copy-button-code').click(function(e){
|
||||||
$operator = check_login(false);
|
$("#button-code").select();
|
||||||
|
document.execCommand('copy');
|
||||||
start_xml_output();
|
});
|
||||||
if ($operator) {
|
});
|
||||||
echo "<login><status>OK</status></login>";
|
})(Mibew, jQuery);
|
||||||
} else {
|
|
||||||
echo "<login><status>FAILED</status></login>";
|
|
||||||
}
|
|
||||||
|
|
||||||
exit;
|
|
||||||
?>
|
|
@ -1,400 +0,0 @@
|
|||||||
/**
|
|
||||||
* @preserve This file is part of Mibew Messenger project.
|
|
||||||
* http://mibew.org
|
|
||||||
*
|
|
||||||
* Copyright (c) 2005-2014 Mibew Messenger Community
|
|
||||||
* License: http://mibew.org/license.php
|
|
||||||
*/
|
|
||||||
|
|
||||||
var FrameUtils = {
|
|
||||||
getDocument: function(frm) {
|
|
||||||
if (frm.contentDocument) {
|
|
||||||
return frm.contentDocument;
|
|
||||||
} else if (frm.contentWindow) {
|
|
||||||
return frm.contentWindow.document;
|
|
||||||
} else if (frm.document) {
|
|
||||||
return frm.document;
|
|
||||||
} else {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
initFrame: function(frm) {
|
|
||||||
var doc = this.getDocument(frm);
|
|
||||||
doc.open();
|
|
||||||
doc.write("<html><head>");
|
|
||||||
doc.write("<link rel=\"stylesheet\" type=\"text/css\" media=\"all\" href=\""+Chat.cssfile+"\">");
|
|
||||||
doc.write("</head><body bgcolor=\"#FFFFFF\" text=#000000\" link=\"#C28400\" vlink=\"#C28400\" alink=\"#C28400\">");
|
|
||||||
doc.write("<table width=\"100%\" cellspacing=\"0\" cellpadding=\"0\" border=\"0\"><tr><td valign=\"top\" class=\"message\" id=\"content\"></td></tr></table><a id=\"bottom\" name=\"bottom\"></a>");
|
|
||||||
doc.write("</body></html>");
|
|
||||||
doc.close();
|
|
||||||
frm.onload = function() {
|
|
||||||
if( frm.myHtml ) {
|
|
||||||
FrameUtils.getDocument(frm).getElementById('content').innerHTML += frm.myHtml;
|
|
||||||
FrameUtils.scrollDown(frm);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
},
|
|
||||||
|
|
||||||
insertIntoFrame: function(frm, htmlcontent) {
|
|
||||||
var vcontent = this.getDocument(frm).getElementById('content');
|
|
||||||
if( vcontent == null ) {
|
|
||||||
if( !frm.myHtml ) frm.myHtml = "";
|
|
||||||
frm.myHtml += htmlcontent;
|
|
||||||
} else {
|
|
||||||
vcontent.innerHTML += htmlcontent;
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
scrollDown: function(frm) {
|
|
||||||
var vbottom = this.getDocument(frm).getElementById('bottom');
|
|
||||||
if( myAgent == 'opera' ) {
|
|
||||||
try {
|
|
||||||
frm.contentWindow.scrollTo(0,this.getDocument(frm).getElementById('content').clientHeight);
|
|
||||||
} catch(e) {}
|
|
||||||
}
|
|
||||||
if( vbottom ) {
|
|
||||||
vbottom.scrollIntoView(false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
Ajax.ChatThreadUpdater = Class.create();
|
|
||||||
Class.inherit( Ajax.ChatThreadUpdater, Ajax.Base, {
|
|
||||||
|
|
||||||
initialize: function(_options) {
|
|
||||||
this.setOptions(_options);
|
|
||||||
this._options.onComplete = this.requestComplete.bind(this);
|
|
||||||
this._options.onException = this.handleException.bind(this);
|
|
||||||
this._options.onTimeout = this.handleTimeout.bind(this);
|
|
||||||
this._options.timeout = 5000;
|
|
||||||
this.updater = {};
|
|
||||||
this.frequency = (this._options.frequency || 2);
|
|
||||||
this.lastupdate = 0;
|
|
||||||
this.cansend = true;
|
|
||||||
this.skipNextsound = true;
|
|
||||||
this.focused = true;
|
|
||||||
this.ownThread = this._options.message != null;
|
|
||||||
FrameUtils.initFrame(this._options.container);
|
|
||||||
if( this._options.message ) {
|
|
||||||
this._options.message.onkeydown = this.handleKeyDown.bind(this);
|
|
||||||
this._options.message.onfocus = (function() { this.focused = true; }).bind(this);
|
|
||||||
this._options.message.onblur = (function() { this.focused = false; }).bind(this)
|
|
||||||
}
|
|
||||||
this.update();
|
|
||||||
},
|
|
||||||
|
|
||||||
handleException: function(_request, ex) {
|
|
||||||
this.setStatus("offline, reconnecting");
|
|
||||||
this.stopUpdate();
|
|
||||||
this.timer = setTimeout(this.update.bind(this), 1000);
|
|
||||||
},
|
|
||||||
|
|
||||||
handleTimeout: function(_request) {
|
|
||||||
this.setStatus("timeout, reconnecting");
|
|
||||||
this.stopUpdate();
|
|
||||||
this.timer = setTimeout(this.update.bind(this), 1000);
|
|
||||||
},
|
|
||||||
|
|
||||||
updateOptions: function(act) {
|
|
||||||
this._options.parameters = 'act='+act+'&thread=' + (this._options.threadid || 0) +
|
|
||||||
'&token=' + (this._options.token || 0)+
|
|
||||||
'&lastid=' + (this._options.lastid || 0);
|
|
||||||
if( this._options.user )
|
|
||||||
this._options.parameters += "&user=true";
|
|
||||||
if( act == 'refresh' && this._options.message && this._options.message.value != '' )
|
|
||||||
this._options.parameters += "&typed=1";
|
|
||||||
},
|
|
||||||
|
|
||||||
enableInput: function(val) {
|
|
||||||
if( this._options.message )
|
|
||||||
this._options.message.disabled = !val;
|
|
||||||
},
|
|
||||||
|
|
||||||
stopUpdate: function() {
|
|
||||||
this.enableInput(true);
|
|
||||||
if( this.updater._options )
|
|
||||||
this.updater._options.onComplete = undefined;
|
|
||||||
clearTimeout(this.timer);
|
|
||||||
},
|
|
||||||
|
|
||||||
update: function() {
|
|
||||||
this.updateOptions("refresh");
|
|
||||||
this.updater = new Ajax.Request(this._options.servl, this._options);
|
|
||||||
},
|
|
||||||
|
|
||||||
requestComplete: function(_response) {
|
|
||||||
try {
|
|
||||||
this.enableInput(true);
|
|
||||||
this.cansend = true;
|
|
||||||
var xmlRoot = Ajax.getXml(_response);
|
|
||||||
if( xmlRoot && xmlRoot.tagName == 'thread' ) {
|
|
||||||
this.updateContent( xmlRoot );
|
|
||||||
} else {
|
|
||||||
this.handleError(_response, xmlRoot, 'refresh messages failed');
|
|
||||||
}
|
|
||||||
} catch (e) {
|
|
||||||
}
|
|
||||||
this.skipNextsound = false;
|
|
||||||
this.timer = setTimeout(this.update.bind(this), this.frequency * 1000);
|
|
||||||
},
|
|
||||||
|
|
||||||
postMessage: function(msg) {
|
|
||||||
if( msg == "" || !this.cansend) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
this.cansend = false;
|
|
||||||
this.stopUpdate();
|
|
||||||
this.skipNextsound = true;
|
|
||||||
this.updateOptions("post");
|
|
||||||
var postOptions = {}.extend(this._options);
|
|
||||||
postOptions.parameters += "&message=" + encodeURIComponent(msg);
|
|
||||||
postOptions.onComplete = (function(presponse) {
|
|
||||||
this.requestComplete( presponse );
|
|
||||||
if( this._options.message ) {
|
|
||||||
this._options.message.value = '';
|
|
||||||
this._options.message.focus();
|
|
||||||
}
|
|
||||||
}).bind(this);
|
|
||||||
if( myRealAgent != 'opera' )
|
|
||||||
this.enableInput(false);
|
|
||||||
this.updater = new Ajax.Request(this._options.servl, postOptions);
|
|
||||||
},
|
|
||||||
|
|
||||||
changeName: function(newname) {
|
|
||||||
this.skipNextsound = true;
|
|
||||||
new Ajax.Request(this._options.servl, {parameters:'act=rename&thread=' + (this._options.threadid || 0) +
|
|
||||||
'&token=' + (this._options.token || 0) + '&name=' + encodeURIComponent(newname)});
|
|
||||||
|
|
||||||
},
|
|
||||||
|
|
||||||
onThreadClosed: function(_response) {
|
|
||||||
var xmlRoot = Ajax.getXml(_response);
|
|
||||||
if( xmlRoot && xmlRoot.tagName == 'closed' ) {
|
|
||||||
setTimeout('window.close()', 2000);
|
|
||||||
} else {
|
|
||||||
this.handleError(_response, xmlRoot, 'cannot close');
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
closeThread: function() {
|
|
||||||
var _params = 'act=close&thread=' + (this._options.threadid || 0) + '&token=' + (this._options.token || 0);
|
|
||||||
if( this._options.user )
|
|
||||||
_params += "&user=true";
|
|
||||||
new Ajax.Request(this._options.servl, {parameters:_params, onComplete: this.onThreadClosed.bind(this)});
|
|
||||||
},
|
|
||||||
|
|
||||||
processMessage: function(_target, message) {
|
|
||||||
var destHtml = NodeUtils.getNodeText(message);
|
|
||||||
FrameUtils.insertIntoFrame(_target, destHtml );
|
|
||||||
},
|
|
||||||
|
|
||||||
showTyping: function(istyping) {
|
|
||||||
if( $("typingdiv") ) {
|
|
||||||
$("typingdiv").style.display=istyping ? 'inline' : 'none';
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
setupAvatar: function(avatar) {
|
|
||||||
var imageLink = NodeUtils.getNodeText(avatar);
|
|
||||||
if( this._options.avatar && this._options.user ) {
|
|
||||||
this._options.avatar.innerHTML = imageLink != ""
|
|
||||||
? "<img src=\""+Chat.mibewRoot+"/images/free.gif\" width=\"7\" height=\"1\" border=\"0\" alt=\"\" /><img src=\""
|
|
||||||
+imageLink+ "\" border=\"0\" alt=\"\"/>"
|
|
||||||
: "";
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
updateContent: function(xmlRoot) {
|
|
||||||
var haveMessage = false;
|
|
||||||
|
|
||||||
var result_div = this._options.container;
|
|
||||||
var _lastid = NodeUtils.getAttrValue(xmlRoot, "lastid");
|
|
||||||
if( _lastid ) {
|
|
||||||
this._options.lastid = _lastid;
|
|
||||||
}
|
|
||||||
|
|
||||||
var typing = NodeUtils.getAttrValue(xmlRoot, "typing");
|
|
||||||
if( typing ) {
|
|
||||||
this.showTyping(typing == '1');
|
|
||||||
}
|
|
||||||
|
|
||||||
var canpost = NodeUtils.getAttrValue(xmlRoot, "canpost");
|
|
||||||
if( canpost ) {
|
|
||||||
if( canpost == '1' && !this.ownThread || this.ownThread && canpost != '1' ) {
|
|
||||||
window.location.href = window.location.href;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for( var i = 0; i < xmlRoot.childNodes.length; i++ ) {
|
|
||||||
var node = xmlRoot.childNodes[i];
|
|
||||||
if( node.tagName == 'message' ) {
|
|
||||||
haveMessage = true;
|
|
||||||
this.processMessage(result_div, node);
|
|
||||||
} else if( node.tagName == 'avatar' ) {
|
|
||||||
this.setupAvatar(node);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(window.location.search.indexOf('trace=on')>=0) {
|
|
||||||
var val = "updated";
|
|
||||||
if(this.lastupdate > 0) {
|
|
||||||
var seconds = ((new Date()).getTime() - this.lastupdate)/1000;
|
|
||||||
val = val + ", " + seconds + " secs";
|
|
||||||
if(seconds > 10) {
|
|
||||||
alert(val);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
this.lastupdate = (new Date()).getTime();
|
|
||||||
this.setStatus(val);
|
|
||||||
} else {
|
|
||||||
this.clearStatus();
|
|
||||||
}
|
|
||||||
if( haveMessage ) {
|
|
||||||
FrameUtils.scrollDown(this._options.container);
|
|
||||||
if(!this.skipNextsound) {
|
|
||||||
var tsound = $('soundimg');
|
|
||||||
if(tsound == null || tsound.className.match(new RegExp("\\bisound\\b")) ) {
|
|
||||||
playSound(Chat.mibewRoot+'/sounds/new_message.wav');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if( !this.focused ) {
|
|
||||||
window.focus();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
isSendkey: function(ctrlpressed, key) {
|
|
||||||
return ((key==13 && (ctrlpressed || this._options.ignorectrl)) || (key==10));
|
|
||||||
},
|
|
||||||
|
|
||||||
handleKeyDown: function(k) {
|
|
||||||
if( k ){ ctrl=k.ctrlKey;k=k.which; } else { k=event.keyCode;ctrl=event.ctrlKey; }
|
|
||||||
if( this._options.message && this.isSendkey(ctrl, k) ) {
|
|
||||||
var mmsg = this._options.message.value;
|
|
||||||
if( this._options.ignorectrl ) {
|
|
||||||
mmsg = mmsg.replace(/[\r\n]+$/,'');
|
|
||||||
}
|
|
||||||
this.postMessage( mmsg );
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
},
|
|
||||||
|
|
||||||
handleError: function(_response, xmlRoot, _action) {
|
|
||||||
if( xmlRoot && xmlRoot.tagName == 'error' ) {
|
|
||||||
this.setStatus(NodeUtils.getNodeValue(xmlRoot,"descr"));
|
|
||||||
} else {
|
|
||||||
this.setStatus("reconnecting");
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
showStatusDiv: function(k) {
|
|
||||||
if( $("engineinfo") ) {
|
|
||||||
$("engineinfo").style.display='inline';
|
|
||||||
$("engineinfo").innerHTML = k;
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
setStatus: function(k) {
|
|
||||||
if( this.statusTimeout )
|
|
||||||
clearTimeout(this.statusTimeout);
|
|
||||||
this.showStatusDiv(k);
|
|
||||||
this.statusTimeout = setTimeout(this.clearStatus.bind(this), 4000);
|
|
||||||
},
|
|
||||||
|
|
||||||
clearStatus: function() {
|
|
||||||
$("engineinfo").style.display='none';
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
var Chat = {
|
|
||||||
threadUpdater : {},
|
|
||||||
|
|
||||||
applyName: function() {
|
|
||||||
if ( !$('uname').value.match(/^\s*$/) ) {
|
|
||||||
Chat.threadUpdater.changeName($('uname').value);
|
|
||||||
$('changename1').style.display='none';
|
|
||||||
$('changename2').style.display='inline';
|
|
||||||
$('unamelink').innerHTML = htmlescape($('uname').value);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
showNameField: function() {
|
|
||||||
$('changename1').style.display='inline';
|
|
||||||
$('changename2').style.display='none';
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
Behaviour.register({
|
|
||||||
'#postmessage a' : function(el) {
|
|
||||||
el.onclick = function() {
|
|
||||||
var message = $('msgwnd');
|
|
||||||
if( message )
|
|
||||||
Chat.threadUpdater.postMessage(message.value);
|
|
||||||
};
|
|
||||||
},
|
|
||||||
'select#predefined' : function(el) {
|
|
||||||
el.onchange = function() {
|
|
||||||
var message = $('msgwnd');
|
|
||||||
if(this.selectedIndex!=0) {
|
|
||||||
message.value = this.options[this.selectedIndex].innerText || this.options[this.selectedIndex].innerHTML;
|
|
||||||
}
|
|
||||||
this.selectedIndex = 0;
|
|
||||||
message.focus();
|
|
||||||
};
|
|
||||||
},
|
|
||||||
'div#changename2 a' : function(el) {
|
|
||||||
el.onclick = function() {
|
|
||||||
Chat.showNameField();
|
|
||||||
return false;
|
|
||||||
};
|
|
||||||
},
|
|
||||||
'div#changename1 a' : function(el) {
|
|
||||||
el.onclick = function() {
|
|
||||||
Chat.applyName();
|
|
||||||
return false;
|
|
||||||
};
|
|
||||||
},
|
|
||||||
'div#changename1 input#uname' : function(el) {
|
|
||||||
el.onkeydown = function(e) {
|
|
||||||
var ev = e || event;
|
|
||||||
if( ev.keyCode == 13 ) {
|
|
||||||
Chat.applyName();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
},
|
|
||||||
'a#refresh' : function(el) {
|
|
||||||
el.onclick = function() {
|
|
||||||
Chat.threadUpdater.stopUpdate();
|
|
||||||
Chat.threadUpdater.update();
|
|
||||||
};
|
|
||||||
},
|
|
||||||
'a#togglesound' : function(el) {
|
|
||||||
el.onclick = function() {
|
|
||||||
var tsound = $('soundimg');
|
|
||||||
if(!tsound) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if(tsound.className.match(new RegExp("\\bisound\\b"))) {
|
|
||||||
tsound.className = "tplimage inosound";
|
|
||||||
} else {
|
|
||||||
tsound.className = "tplimage isound";
|
|
||||||
}
|
|
||||||
var messagePane = $('msgwnd');
|
|
||||||
if(messagePane)
|
|
||||||
messagePane.focus();
|
|
||||||
};
|
|
||||||
},
|
|
||||||
'a.closethread' : function(el) {
|
|
||||||
el.onclick = function() {
|
|
||||||
Chat.threadUpdater.closeThread();
|
|
||||||
};
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
EventHelper.register(window, 'onload', function(){
|
|
||||||
Chat.mibewRoot = threadParams.wroot;
|
|
||||||
Chat.cssfile = threadParams.cssfile;
|
|
||||||
Chat.threadUpdater = new Ajax.ChatThreadUpdater(({ignorectrl:-1,container:myRealAgent=='safari'?self.frames[0]:$("chatwnd"),avatar:$("avatarwnd"),message:$("msgwnd")}).extend( threadParams || {} ));
|
|
||||||
});
|
|
63
src/mibew/js/source/chat/app.js
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
/*!
|
||||||
|
* This file is a part of Mibew Messenger.
|
||||||
|
*
|
||||||
|
* Copyright 2005-2023 the original author or authors.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
(function (Mibew, _) {
|
||||||
|
|
||||||
|
// Create shortcut for application
|
||||||
|
var app = Mibew.Application;
|
||||||
|
|
||||||
|
// Define regions
|
||||||
|
app.addRegions({
|
||||||
|
mainRegion: '#main-region'
|
||||||
|
});
|
||||||
|
|
||||||
|
// Initialize application
|
||||||
|
app.addInitializer(function(options){
|
||||||
|
// Initialize Server
|
||||||
|
Mibew.Objects.server = new Mibew.Server(_.extend(
|
||||||
|
{'interactionType': MibewAPIChatInteraction},
|
||||||
|
options.server
|
||||||
|
));
|
||||||
|
|
||||||
|
// Initialize Page
|
||||||
|
Mibew.Objects.Models.page = new Mibew.Models.Page(options.page);
|
||||||
|
|
||||||
|
switch (options.startFrom) {
|
||||||
|
case 'chat':
|
||||||
|
app.Chat.start(options.chatOptions);
|
||||||
|
break;
|
||||||
|
case 'survey':
|
||||||
|
app.Survey.start(options.surveyOptions);
|
||||||
|
break;
|
||||||
|
case 'leaveMessage':
|
||||||
|
app.LeaveMessage.start(options.leaveMessageOptions);
|
||||||
|
break;
|
||||||
|
case 'invitation':
|
||||||
|
app.Invitation.start(options.invitationOptions);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
throw new Error("Don't know how to start!");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
app.on('start', function() {
|
||||||
|
// Run Server updater
|
||||||
|
Mibew.Objects.server.runUpdater();
|
||||||
|
});
|
||||||
|
|
||||||
|
})(Mibew, _);
|
@ -0,0 +1,49 @@
|
|||||||
|
/*!
|
||||||
|
* This file is a part of Mibew Messenger.
|
||||||
|
*
|
||||||
|
* Copyright 2005-2023 the original author or authors.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
(function(Mibew) {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @class Represents messages list view
|
||||||
|
*/
|
||||||
|
Mibew.Views.MessagesCollection = Mibew.Views.CollectionBase.extend(
|
||||||
|
/** @lends Mibew.Views.MessagesCollection.prototype */
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Class name for view's DOM element
|
||||||
|
* @type String
|
||||||
|
*/
|
||||||
|
className: 'messages-collection',
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns default child view constructor.
|
||||||
|
*
|
||||||
|
* The function is used instead of "childView" property to provide
|
||||||
|
* an ability to override child view constructor without this class
|
||||||
|
* overriding.
|
||||||
|
*
|
||||||
|
* @param {Backbone.Model} model The model the view created for.
|
||||||
|
* @returns {Backbone.Marionette.ItemView}
|
||||||
|
*/
|
||||||
|
getChildView: function(model) {
|
||||||
|
return Mibew.Views.Message;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
})(Mibew);
|
@ -0,0 +1,49 @@
|
|||||||
|
/*!
|
||||||
|
* This file is a part of Mibew Messenger.
|
||||||
|
*
|
||||||
|
* Copyright 2005-2023 the original author or authors.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
(function(Mibew) {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @class Represents Status bar view
|
||||||
|
*/
|
||||||
|
Mibew.Views.StatusCollection = Mibew.Views.CollectionBase.extend(
|
||||||
|
/** @lends Mibew.Views.StatusCollection.prototype */
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Class name for view's DOM element
|
||||||
|
* @type String
|
||||||
|
*/
|
||||||
|
className: 'status-collection',
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns default child view constructor.
|
||||||
|
*
|
||||||
|
* The function is used instead of "childView" property to provide
|
||||||
|
* an ability to override child view constructor without this class
|
||||||
|
* overriding.
|
||||||
|
*
|
||||||
|
* @param {Backbone.Model} model The model the view created for.
|
||||||
|
* @returns {Backbone.Marionette.ItemView}
|
||||||
|
*/
|
||||||
|
getChildView: function(model) {
|
||||||
|
return Mibew.Views.Status;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
})(Mibew);
|
193
src/mibew/js/source/chat/collections/messages.js
Normal file
@ -0,0 +1,193 @@
|
|||||||
|
/*!
|
||||||
|
* This file is a part of Mibew Messenger.
|
||||||
|
*
|
||||||
|
* Copyright 2005-2023 the original author or authors.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
(function(Mibew, Backbone, _){
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @class Represents messages list
|
||||||
|
*/
|
||||||
|
Mibew.Collections.Messages = Backbone.Collection.extend(
|
||||||
|
/** @lends Mibew.Collections.Message.prototype */
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Default contructor for model
|
||||||
|
* @type Function
|
||||||
|
*/
|
||||||
|
model: Mibew.Models.Message,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Collection initializer.
|
||||||
|
*/
|
||||||
|
initialize: function() {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Contains ids of periodically called functions
|
||||||
|
* @type Array
|
||||||
|
*/
|
||||||
|
this.periodicallyCalled = [];
|
||||||
|
|
||||||
|
// Periodically try to get new messages
|
||||||
|
this.periodicallyCalled.push(
|
||||||
|
Mibew.Objects.server.callFunctionsPeriodically(
|
||||||
|
_.bind(this.updateMessagesFunctionBuilder, this),
|
||||||
|
_.bind(this.updateMessages, this)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Collection finalizer
|
||||||
|
*/
|
||||||
|
finalize: function() {
|
||||||
|
// Stop call functions periodically
|
||||||
|
for (var i = 0; i < this.periodicallyCalled.length; i++) {
|
||||||
|
Mibew.Objects.server.stopCallFunctionsPeriodically(
|
||||||
|
this.periodicallyCalled[i]
|
||||||
|
);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Update messages if they are exist.
|
||||||
|
* @param args {Object} An object of passed arguments
|
||||||
|
*/
|
||||||
|
updateMessages: function(args) {
|
||||||
|
|
||||||
|
// Update last message id
|
||||||
|
if (args.lastId) {
|
||||||
|
Mibew.Objects.Models.thread.set({lastId: args.lastId});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Use shortcut for KIND_PLUGIN
|
||||||
|
var kindPlugin = Mibew.Models.Message.prototype.KIND_PLUGIN;
|
||||||
|
|
||||||
|
// Get all new messages
|
||||||
|
var newMessages = [];
|
||||||
|
var messageData, pluginName, eventName, eventArgs;
|
||||||
|
for(var i = 0, length = args.messages.length; i < length; i++) {
|
||||||
|
messageData = args.messages[i];
|
||||||
|
if (messageData.kind != kindPlugin) {
|
||||||
|
// Message have one of the core kinds. Just store it.
|
||||||
|
newMessages.push(
|
||||||
|
new Mibew.Models.Message(messageData)
|
||||||
|
);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Message have KIND_PLUGIN kind and need to be processed
|
||||||
|
// by plugins to know how to display it.
|
||||||
|
|
||||||
|
// Check if message is an real Object
|
||||||
|
if ((typeof messageData.data != 'object')
|
||||||
|
|| (messageData.data === null)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Prepare event name.
|
||||||
|
//
|
||||||
|
// If plugin name was specified it will be
|
||||||
|
// 'process:<plugin_name>:plugin:message' and
|
||||||
|
// 'process:plugin:message' otherwise.
|
||||||
|
pluginName = messageData.plugin || false;
|
||||||
|
eventName = 'process:'
|
||||||
|
+ ((pluginName !== false) ? pluginName + ':' : '')
|
||||||
|
+ 'plugin:message';
|
||||||
|
|
||||||
|
// Prepare event arguments.
|
||||||
|
//
|
||||||
|
// It is an object with following fields:
|
||||||
|
// - 'messageData': object which contains message data
|
||||||
|
// passed from server.
|
||||||
|
// - 'model': message model initialized by the plugin or
|
||||||
|
// boolean false if message should not be displayed. By
|
||||||
|
// default it field equals to boolean false.
|
||||||
|
eventArgs = {
|
||||||
|
'messageData': messageData,
|
||||||
|
'model': false
|
||||||
|
};
|
||||||
|
|
||||||
|
// Trigger event. See description of eventName and eventArgs
|
||||||
|
// above.
|
||||||
|
this.trigger(eventName, eventArgs);
|
||||||
|
|
||||||
|
if (eventArgs.model) {
|
||||||
|
// Check if plugin set message id
|
||||||
|
if (! eventArgs.model.get('id')) {
|
||||||
|
// Message must have an id, set it
|
||||||
|
eventArgs.model.set({'id': messageData.id});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Store custom plugin message in the collection
|
||||||
|
newMessages.push(
|
||||||
|
eventArgs.model
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add new messages to the message collection if there are any
|
||||||
|
// messages
|
||||||
|
if (newMessages.length > 0) {
|
||||||
|
this.add(newMessages);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Builds updateMessages function, that should be called
|
||||||
|
* periodically at the server side
|
||||||
|
* @returns {Object[]} Array of functions objects
|
||||||
|
*/
|
||||||
|
updateMessagesFunctionBuilder: function() {
|
||||||
|
// Get thread and user objects
|
||||||
|
var thread = Mibew.Objects.Models.thread;
|
||||||
|
var user = Mibew.Objects.Models.user;
|
||||||
|
|
||||||
|
// Build functions list
|
||||||
|
return [
|
||||||
|
{
|
||||||
|
"function": "updateMessages",
|
||||||
|
"arguments": {
|
||||||
|
"return": {
|
||||||
|
'messages': 'messages',
|
||||||
|
'lastId': 'lastId'
|
||||||
|
},
|
||||||
|
"references": {},
|
||||||
|
"threadId": thread.get('id'),
|
||||||
|
"token": thread.get('token'),
|
||||||
|
"lastId": thread.get('lastId'),
|
||||||
|
"user": (! user.get('isAgent'))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
];
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Override Backbone.Collection.add method to call additional event
|
||||||
|
*/
|
||||||
|
add: function() {
|
||||||
|
// Get arguments list
|
||||||
|
var args = Array.prototype.slice.apply(arguments);
|
||||||
|
// Call method of the parent class
|
||||||
|
var res = Backbone.Collection.prototype.add.apply(this, args);
|
||||||
|
// Triggers additional event
|
||||||
|
this.trigger('multiple:add');
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
})(Mibew, Backbone, _);
|
37
src/mibew/js/source/chat/collections/status.js
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
/*!
|
||||||
|
* This file is a part of Mibew Messenger.
|
||||||
|
*
|
||||||
|
* Copyright 2005-2023 the original author or authors.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
(function(Mibew, Backbone){
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @class Represents status bar
|
||||||
|
*/
|
||||||
|
Mibew.Collections.Status = Backbone.Collection.extend(
|
||||||
|
/** @lends Mibew.Collections.Status.prototype */
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Use for sort controls in collection
|
||||||
|
* @param {Backbone.Model} model Control model
|
||||||
|
*/
|
||||||
|
comparator: function(model) {
|
||||||
|
return model.get('weight');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
})(Mibew, Backbone);
|
37
src/mibew/js/source/chat/init.js
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
/*!
|
||||||
|
* This file is a part of Mibew Messenger.
|
||||||
|
*
|
||||||
|
* Copyright 2005-2023 the original author or authors.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
(function(Mibew){
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @namespace Holds application region constructors
|
||||||
|
*/
|
||||||
|
Mibew.Regions = {};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @namespace Holds application layouts constructors
|
||||||
|
*/
|
||||||
|
Mibew.Layouts = {};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create application instance.
|
||||||
|
* @type Backbone.Marionette.Application
|
||||||
|
*/
|
||||||
|
Mibew.Application = new Backbone.Marionette.Application();
|
||||||
|
|
||||||
|
})(Mibew);
|
67
src/mibew/js/source/chat/layouts/chat.js
Normal file
@ -0,0 +1,67 @@
|
|||||||
|
/*!
|
||||||
|
* This file is a part of Mibew Messenger.
|
||||||
|
*
|
||||||
|
* Copyright 2005-2023 the original author or authors.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
(function(Mibew, Backbone){
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Represents chat layout
|
||||||
|
*/
|
||||||
|
Mibew.Layouts.Chat = Backbone.Marionette.LayoutView.extend(
|
||||||
|
/** @lends Mibew.Layouts.Chat.prototype */
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Template function
|
||||||
|
* @type Function
|
||||||
|
*/
|
||||||
|
template: Handlebars.templates['chat/layout'],
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Regions list
|
||||||
|
* @type Object
|
||||||
|
*/
|
||||||
|
regions: {
|
||||||
|
controlsRegion: '#controls-region',
|
||||||
|
avatarRegion: '#avatar-region',
|
||||||
|
messagesRegion: {
|
||||||
|
selector: '#messages-region',
|
||||||
|
regionClass: Mibew.Regions.Messages
|
||||||
|
},
|
||||||
|
statusRegion: '#status-region',
|
||||||
|
messageFormRegion: '#message-form-region'
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Override Backbone.Marionette.ItemView.serializeData to pass some
|
||||||
|
* extra fields to template.
|
||||||
|
*
|
||||||
|
* Use undocumented feature of layouts: passing data to template via
|
||||||
|
* serializeData method.
|
||||||
|
*
|
||||||
|
* @returns {Object} Template data
|
||||||
|
*/
|
||||||
|
serializeData: function() {
|
||||||
|
var models = Mibew.Objects.Models;
|
||||||
|
return {
|
||||||
|
page: models.page.toJSON(),
|
||||||
|
user: models.user.toJSON()
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
})(Mibew, Backbone);
|
46
src/mibew/js/source/chat/layouts/invitation.js
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
/*!
|
||||||
|
* This file is a part of Mibew Messenger.
|
||||||
|
*
|
||||||
|
* Copyright 2005-2023 the original author or authors.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
(function(Mibew, Backbone){
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Represents invitation layout
|
||||||
|
*/
|
||||||
|
Mibew.Layouts.Invitation = Backbone.Marionette.LayoutView.extend(
|
||||||
|
/** @lends Mibew.Layouts.Invitation.prototype */
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Template function
|
||||||
|
* @type Function
|
||||||
|
*/
|
||||||
|
template: Handlebars.templates['invitation/layout'],
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Regions list
|
||||||
|
* @type Object
|
||||||
|
*/
|
||||||
|
regions: {
|
||||||
|
messagesRegion: {
|
||||||
|
selector: '#invitation-messages-region',
|
||||||
|
regionClass: Mibew.Regions.Messages
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
})(Mibew, Backbone);
|
59
src/mibew/js/source/chat/layouts/leave_message.js
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
/*!
|
||||||
|
* This file is a part of Mibew Messenger.
|
||||||
|
*
|
||||||
|
* Copyright 2005-2023 the original author or authors.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
(function(Mibew, Backbone){
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Represents leave message page layout
|
||||||
|
*/
|
||||||
|
Mibew.Layouts.LeaveMessage = Backbone.Marionette.LayoutView.extend(
|
||||||
|
/** @lends Mibew.Layouts.LeaveMessage.prototype */
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Template function
|
||||||
|
* @type Function
|
||||||
|
*/
|
||||||
|
template: Handlebars.templates['leave_message/layout'],
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Regions list
|
||||||
|
* @type Object
|
||||||
|
*/
|
||||||
|
regions: {
|
||||||
|
leaveMessageFormRegion: '#content-wrapper',
|
||||||
|
descriptionRegion: '#description-region'
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Override Backbone.Marionette.ItemView.serializeData to pass some
|
||||||
|
* extra fields to template.
|
||||||
|
*
|
||||||
|
* Use undocumented feature of layouts: passing data to template via
|
||||||
|
* serializeData method.
|
||||||
|
*
|
||||||
|
* @returns {Object} Template data
|
||||||
|
*/
|
||||||
|
serializeData: function() {
|
||||||
|
return {
|
||||||
|
page: Mibew.Objects.Models.page.toJSON()
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
})(Mibew, Backbone);
|
58
src/mibew/js/source/chat/layouts/survey.js
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
/*!
|
||||||
|
* This file is a part of Mibew Messenger.
|
||||||
|
*
|
||||||
|
* Copyright 2005-2023 the original author or authors.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
(function(Mibew, Backbone){
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Represents survey layout
|
||||||
|
*/
|
||||||
|
Mibew.Layouts.Survey = Backbone.Marionette.LayoutView.extend(
|
||||||
|
/** @lends Mibew.Layouts.Survey.prototype */
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Template function
|
||||||
|
* @type Function
|
||||||
|
*/
|
||||||
|
template: Handlebars.templates['survey/layout'],
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Regions list
|
||||||
|
* @type Object
|
||||||
|
*/
|
||||||
|
regions: {
|
||||||
|
surveyFormRegion: '#content-wrapper'
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Override Backbone.Marionette.ItemView.serializeData to pass some
|
||||||
|
* extra fields to template.
|
||||||
|
*
|
||||||
|
* Use undocumented feature of layouts: passing data to template via
|
||||||
|
* serializeData method.
|
||||||
|
*
|
||||||
|
* @returns {Object} Template data
|
||||||
|
*/
|
||||||
|
serializeData: function() {
|
||||||
|
return {
|
||||||
|
page: Mibew.Objects.Models.page.toJSON()
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
})(Mibew, Backbone);
|
45
src/mibew/js/source/chat/mibewapi_chat_interaction.js
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
/*!
|
||||||
|
* This file is a part of Mibew Messenger.
|
||||||
|
*
|
||||||
|
* Copyright 2005-2023 the original author or authors.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Represents Chat Window to core interaction type
|
||||||
|
*
|
||||||
|
* @constructor
|
||||||
|
*/
|
||||||
|
MibewAPIChatInteraction = function() {
|
||||||
|
this.mandatoryArguments = function() {
|
||||||
|
return {
|
||||||
|
'*': {
|
||||||
|
'threadId': null,
|
||||||
|
'token': null,
|
||||||
|
'return': {},
|
||||||
|
'references': {}
|
||||||
|
},
|
||||||
|
'result': {
|
||||||
|
'errorCode': 0
|
||||||
|
}
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
this.getReservedFunctionsNames = function() {
|
||||||
|
return [
|
||||||
|
'result'
|
||||||
|
];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
MibewAPIChatInteraction.prototype = new MibewAPIInteraction();
|
49
src/mibew/js/source/chat/model_views/avatar.js
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
/*!
|
||||||
|
* This file is a part of Mibew Messenger.
|
||||||
|
*
|
||||||
|
* Copyright 2005-2023 the original author or authors.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
(function(Mibew, Backbone, Handlebars) {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @class Represents user avatar view
|
||||||
|
*/
|
||||||
|
Mibew.Views.Avatar = Backbone.Marionette.ItemView.extend(
|
||||||
|
/** @lends Mibew.Views.Avatar.prototype */
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Template function
|
||||||
|
* @type Function
|
||||||
|
*/
|
||||||
|
template: Handlebars.templates['chat/avatar'],
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class name for view's DOM element
|
||||||
|
* @type String
|
||||||
|
*/
|
||||||
|
className: 'avatar',
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Map model events to the view methods
|
||||||
|
* @type Object
|
||||||
|
*/
|
||||||
|
modelEvents: {
|
||||||
|
'change': 'render'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
})(Mibew, Backbone, Handlebars);
|
65
src/mibew/js/source/chat/model_views/controls/close.js
Normal file
@ -0,0 +1,65 @@
|
|||||||
|
/*!
|
||||||
|
* This file is a part of Mibew Messenger.
|
||||||
|
*
|
||||||
|
* Copyright 2005-2023 the original author or authors.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
(function(Mibew, Handlebars, _) {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @class Represents Close control view
|
||||||
|
*/
|
||||||
|
Mibew.Views.CloseControl = Mibew.Views.Control.extend(
|
||||||
|
/** @lends Mibew.Views.CloseControl.prototype */
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Template function
|
||||||
|
* @type Function
|
||||||
|
*/
|
||||||
|
template: Handlebars.templates['chat/controls/close'],
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Map ui events to view methods
|
||||||
|
* The view inherits events from
|
||||||
|
* {@link Mibew.Views.Control.prototype.events}.
|
||||||
|
* @type Object
|
||||||
|
*/
|
||||||
|
events: _.extend(
|
||||||
|
{},
|
||||||
|
Mibew.Views.Control.prototype.events,
|
||||||
|
{
|
||||||
|
'click': 'closeThread'
|
||||||
|
}
|
||||||
|
),
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Display confirmation dialog and close chat window
|
||||||
|
*/
|
||||||
|
closeThread: function() {
|
||||||
|
// Show confirmation message if can
|
||||||
|
var confirmMessage = Mibew.Localization.trans('Are you sure that you want to leave the chat?'),
|
||||||
|
context = this;
|
||||||
|
if (confirmMessage !== false) {
|
||||||
|
Mibew.Utils.confirm(confirmMessage, function(value) {
|
||||||
|
if (value) {
|
||||||
|
context.model.closeThread();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
})(Mibew, Handlebars, _);
|
69
src/mibew/js/source/chat/model_views/controls/history.js
Normal file
@ -0,0 +1,69 @@
|
|||||||
|
/*!
|
||||||
|
* This file is a part of Mibew Messenger.
|
||||||
|
*
|
||||||
|
* Copyright 2005-2023 the original author or authors.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
(function(Mibew, Handlebars, _) {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @class Represents History control view
|
||||||
|
*/
|
||||||
|
Mibew.Views.HistoryControl = Mibew.Views.Control.extend(
|
||||||
|
/** @lends Mibew.Views.HistoryControl.prototype */
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Template function
|
||||||
|
* @type Function
|
||||||
|
*/
|
||||||
|
template: Handlebars.templates['chat/controls/history'],
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Map ui events to view methods
|
||||||
|
* The view inherits events from
|
||||||
|
* {@link Mibew.Views.Control.prototype.events}.
|
||||||
|
* @type Object
|
||||||
|
*/
|
||||||
|
events: _.extend(
|
||||||
|
{},
|
||||||
|
Mibew.Views.Control.prototype.events,
|
||||||
|
{
|
||||||
|
'click': 'showHistory'
|
||||||
|
}
|
||||||
|
),
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Display history window
|
||||||
|
*/
|
||||||
|
showHistory: function() {
|
||||||
|
var user = Mibew.Objects.Models.user;
|
||||||
|
var link = this.model.get('link');
|
||||||
|
if (user.get('isAgent') && link) {
|
||||||
|
var winParams = Mibew.Utils.buildWindowParams(this.model.get('windowParams'));
|
||||||
|
|
||||||
|
// TODO: Kill & at the server side
|
||||||
|
link = link.replace('&', '&', 'g');
|
||||||
|
|
||||||
|
var newWindow = window.open(link, 'UserHistory', winParams);
|
||||||
|
if (newWindow !== null) {
|
||||||
|
newWindow.focus();
|
||||||
|
newWindow.opener=window;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
})(Mibew, Handlebars, _);
|