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 |
64
.gitignore
vendored
@ -1,9 +1,55 @@
|
||||
bin
|
||||
src/messenger/.idea/workspace.xml
|
||||
src/messenger/webim/install/package
|
||||
src/messenger/absent_*
|
||||
src/messenger/release*
|
||||
src/mibewjava/.idea/workspace.xml
|
||||
src/mibewjava/org.mibew.notifier/resources/
|
||||
mibew.ini
|
||||
.DS_Store
|
||||
# IDE folders
|
||||
.idea
|
||||
|
||||
src/mibew/install/package
|
||||
src/absent_*
|
||||
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
|
||||
src/mibew/locales/*
|
||||
!src/mibew/locales/en/
|
||||
|
||||
# Do not index composer files
|
||||
src/composer.phar
|
||||
src/composer.lock
|
||||
|
||||
# Do not index third-party libraries
|
||||
src/mibew/vendor
|
||||
src/mibew/js/vendor
|
||||
|
||||
# Do not index node.js modules that are used for building
|
||||
src/node_modules
|
||||
src/package-lock.json
|
||||
|
||||
# Do not index compiled js files of the core
|
||||
src/mibew/js/compiled/*
|
||||
!src/mibew/js/compiled/.keep
|
||||
|
||||
# Do not index compiled files of chat styles
|
||||
src/mibew/styles/chats/*/templates_compiled/client_side/*
|
||||
!src/mibew/styles/chats/*/templates_compiled/client_side/.keep
|
||||
src/mibew/styles/chats/*/js/compiled/*
|
||||
!src/mibew/styles/chats/*/js/compiled/.keep
|
||||
|
||||
# Do not index compiled files of page styles
|
||||
src/mibew/styles/pages/*/templates_compiled/client_side/*
|
||||
!src/mibew/styles/pages/*/templates_compiled/client_side/.keep
|
||||
|
3
.gitmodules
vendored
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
|
Before Width: | Height: | Size: 348 B |
Before Width: | Height: | Size: 796 B |
Before Width: | Height: | Size: 1.9 KiB |
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
|
||||
}
|
||||
}
|
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"
|
||||
}
|
||||
}
|
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"
|
||||
}
|
||||
}
|
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 +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$/webim/locales/be/properties" charset="windows-1251" />
|
||||
<file url="file://$PROJECT_DIR$/webim/locales/bg/properties" charset="windows-1251" />
|
||||
<file url="file://$PROJECT_DIR$/webim/locales/ca/properties" charset="ISO-8859-1" />
|
||||
<file url="file://$PROJECT_DIR$/webim/locales/ru/properties" charset="windows-1251" />
|
||||
<file url="file://$PROJECT_DIR$/webim/locales/sp/properties" charset="ISO-8859-1" />
|
||||
<file url="file://$PROJECT_DIR$/webim/locales/ua/properties" charset="windows-1251" />
|
||||
</component>
|
||||
</project>
|
||||
|
@ -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>
|
||||
|
@ -1,56 +0,0 @@
|
||||
#!/usr/bin/perl
|
||||
|
||||
sub read_transl($) {
|
||||
my($from) = @_;
|
||||
my %translation = ();
|
||||
open(IN, "webim/locales/$from/properties");
|
||||
while(<IN>) {
|
||||
chomp;
|
||||
if(/^([\w\.]+)=(.*)$/) {
|
||||
if($1 ne "encoding" && $1 ne "output_charset" && $1 ne "output_encoding") {
|
||||
$translation{$1} = $2;
|
||||
}
|
||||
} else {
|
||||
die "wrong line in $from: $_\n";
|
||||
}
|
||||
}
|
||||
close(IN);
|
||||
return %translation;
|
||||
}
|
||||
|
||||
%tr_en = read_transl("en");
|
||||
|
||||
@all_keys = keys %tr_en;
|
||||
|
||||
sub check_transl($%) {
|
||||
my($name,%tr) = @_;
|
||||
print "checking $name...\n";
|
||||
my @totransl = ();
|
||||
for $key (@all_keys) {
|
||||
unless(exists $tr{$key}) {
|
||||
push @totransl, "$key=".$tr_en{$key};
|
||||
}
|
||||
}
|
||||
for $key(keys %tr) {
|
||||
unless(exists $tr_en{$key}) {
|
||||
print "unknown key in $name: $key\n";
|
||||
}
|
||||
}
|
||||
if($#totransl >= 0) {
|
||||
print "@{[$#totransl+1]} lines absent in locales/$name/properties\n";
|
||||
open(OUT, "> absent_$name");
|
||||
for(sort @totransl) {
|
||||
print OUT "$_\n";
|
||||
}
|
||||
close(OUT);
|
||||
}
|
||||
}
|
||||
|
||||
check_transl("ru", read_transl("ru"));
|
||||
check_transl("fr", read_transl("fr"));
|
||||
check_transl("de", read_transl("de"));
|
||||
check_transl("sp", read_transl("sp"));
|
||||
check_transl("it", read_transl("it"));
|
||||
check_transl("pl", read_transl("pl"));
|
||||
check_transl("zh-tw", read_transl("zh-tw"));
|
||||
|
@ -1,5 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
cd webim/js/source
|
||||
ant
|
||||
rm -rf bin
|
@ -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],
|
||||
|
||||
["webim/client.php", 0],
|
||||
["webim/leavemessage.php", 0],
|
||||
["webim/captcha.php", 0],
|
||||
["webim/license.php", 0],
|
||||
["webim/mail.php", 0],
|
||||
|
||||
["libs/operator_settings.php", 2],
|
||||
["webim/libs/chat.php", 0],
|
||||
["libs/pagination.php", 1],
|
||||
["libs/settings.php", 2],
|
||||
["libs/groups.php", 2],
|
||||
["libs/demothread.php", 2],
|
||||
|
||||
["webim/thread.php", 0],
|
||||
["webim/b.php", 0],
|
||||
["webim/button.php", 0],
|
||||
["webim/index.php", 0],
|
||||
|
||||
["webim/libs/.*\\.php", 1],
|
||||
);
|
||||
|
||||
%messagekeys = (
|
||||
"localeid" => 0,
|
||||
"output_charset" => 0,
|
||||
"output_encoding" => 0,
|
||||
"harderrors.header" => 0,
|
||||
|
||||
"errors.required" => 0,
|
||||
"errors.wrong_field" => 0,
|
||||
"errors.file.move.error" => 2,
|
||||
"errors.invalid.file.type" => 2,
|
||||
"errors.file.size.exceeded" => 2,
|
||||
|
||||
"permission.admin" => 1,
|
||||
"permission.takeover" => 1,
|
||||
"permission.viewthreads" => 1,
|
||||
|
||||
"chat.thread.state_chatting_with_agent" => 1,
|
||||
"chat.thread.state_closed" => 1,
|
||||
"chat.thread.state_loading" => 1,
|
||||
"chat.thread.state_wait" => 1,
|
||||
"chat.thread.state_wait_for_another_agent" => 1,
|
||||
|
||||
"clients.queue.chat" => 1,
|
||||
"clients.queue.prio" => 1,
|
||||
"clients.queue.wait" => 1,
|
||||
);
|
||||
|
||||
|
||||
$webimPath = "webim";
|
||||
|
||||
%urls = ();
|
||||
|
||||
%usermessages = ();
|
||||
%operatormessages = ();
|
||||
$current_level = 0;
|
||||
|
||||
sub usemsg($) {
|
||||
my ($m) = @_;
|
||||
$messagekeys{$m} = exists $messagekeys{$m} && $messagekeys{$m} < $current_level ? $messagekeys{$m} : $current_level;
|
||||
if($current_level == -1) {
|
||||
print " .. $m\n";
|
||||
}
|
||||
}
|
||||
|
||||
sub file_content($) {
|
||||
my $input = $_[0];
|
||||
open( IN1, "< $input" ) or die "cannot find file $input";
|
||||
my $oldslash = $/;
|
||||
$/ = EOI;
|
||||
$content = <IN1>;
|
||||
close( IN1 );
|
||||
if($content =~ s/\r//g) {
|
||||
open( OUT1, "> $input") or die "cannot fix $input";
|
||||
print OUT1 $content;
|
||||
close(OUT1);
|
||||
}
|
||||
$/ = $oldslash;
|
||||
return $content;
|
||||
}
|
||||
|
||||
sub process_tpl($) {
|
||||
my ($filename) = @_;
|
||||
my $m = file_content($filename);
|
||||
while( $m =~ /\${msg:([\w\.]+)(,[\w\.]+)?}/g ) {
|
||||
usemsg($1);
|
||||
}
|
||||
while( $m =~ /\${url:([\w\.]+)(,[\w\.]+)?}/g ) {
|
||||
usemsg($1);
|
||||
$urls{"%$1"} = 1;
|
||||
}
|
||||
}
|
||||
|
||||
sub process_php($) {
|
||||
my ($source) = @_;
|
||||
my $content = file_content($source);
|
||||
$content =~ s/<\?xml version=\\"1\.0\\" encoding=\\"UTF-8\\"\?>//;
|
||||
|
||||
while( $content =~ s/<\?(?!xml)(.*?)\?>//s ) {
|
||||
my $inner = $1;
|
||||
while($inner =~ s/(getlocal|getstring|no_field)2?_?\((.*?)[,\)]//s) {
|
||||
my $firstarg = $2;
|
||||
if( $firstarg =~ /^["']([\w\.]+)['"]$/) {
|
||||
usemsg($1);
|
||||
} elsif($firstarg =~ /^\$\w+$/ || $firstarg eq '"$var.header"' || $firstarg eq '"permission.$permid"' || $firstarg eq '$threadstate_key[$thread[\'istate\']]') {
|
||||
# skip
|
||||
} else {
|
||||
print "> unknown: $firstarg\n";
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
sub file_checksum($) {
|
||||
my ($source) = @_;
|
||||
if($source =~ /\.(png|gif|jpg|ico|wav)$/ || $source =~ /config\.php$/) {
|
||||
return "-";
|
||||
}
|
||||
|
||||
my $content = file_content($source);
|
||||
return md5_hex($content);
|
||||
}
|
||||
|
||||
@allsources = ();
|
||||
|
||||
sub process_one($) {
|
||||
my($source) = @_;
|
||||
push @allsources, $source unless $source =~ /$webimPath\/locales/ && $source !~ /$webimPath\/locales\/(en|names)/ || $source =~ /\/package$/;
|
||||
|
||||
if($source !~ /\.(php|tpl)$/) {
|
||||
return;
|
||||
}
|
||||
|
||||
$current_level = -1;
|
||||
|
||||
A: foreach $rule (@rules) {
|
||||
my $key = $$rule[0];
|
||||
if($source =~ /$key/) {
|
||||
$current_level = $$rule[1];
|
||||
last A;
|
||||
}
|
||||
}
|
||||
if($current_level < 0 || $current_level > 2) {
|
||||
print "not detected for: $source\n";
|
||||
$current_level = 0;
|
||||
}
|
||||
|
||||
if($source =~ /\.php$/) {
|
||||
# print "$source ($current_level)\n";
|
||||
process_php($source);
|
||||
} elsif($source =~ /\.tpl$/) {
|
||||
process_tpl($source);
|
||||
} else {
|
||||
#print ". $source\n";
|
||||
}
|
||||
}
|
||||
|
||||
sub process_files($) {
|
||||
my($from) = @_;
|
||||
opendir(DIR, $from) || die "can't opendir $from: $!";
|
||||
my @content = readdir(DIR);
|
||||
closedir DIR;
|
||||
|
||||
for(grep { -f "$from/$_" && ($_ !~ /^\./ || $_ eq ".htaccess") } @content) {
|
||||
process_one("$from/$_");
|
||||
}
|
||||
for(grep { -d "$from/$_" && $_ !~ /^\./ } @content) {
|
||||
process_files("$from/$_");
|
||||
}
|
||||
}
|
||||
|
||||
process_files($webimPath);
|
||||
|
||||
# fix
|
||||
$messagekeys{'page.analysis.userhistory.title'} = 1;
|
||||
$messagekeys{'errors.failed.uploading.file'} = 2;
|
||||
|
||||
|
||||
open( OUT, "> $webimPath/locales/names/level1") or die "cannot write file, $!";
|
||||
for $key(sort grep { $messagekeys{$_} == 0 } keys %messagekeys) {
|
||||
print OUT "$key\n";
|
||||
}
|
||||
close( OUT );
|
||||
|
||||
open( OUT, "> $webimPath/locales/names/level2") or die "cannot write file, $!";
|
||||
for $key(sort grep { $messagekeys{$_} == 1 } keys %messagekeys) {
|
||||
print OUT "$key\n";
|
||||
}
|
||||
close( OUT );
|
||||
|
||||
open( OUT, "> $webimPath/install/package") or die "cannot write file, $!";
|
||||
for $key(sort @allsources) {
|
||||
$digest = file_checksum($key);
|
||||
$key =~ s/$webimPath\///;
|
||||
print OUT "$key $digest\n";
|
||||
}
|
||||
close( OUT );
|
@ -1,66 +0,0 @@
|
||||
#!/usr/bin/perl
|
||||
|
||||
##################################################################
|
||||
# Arguments
|
||||
##################################################################
|
||||
|
||||
$targetFolder = "deploy";
|
||||
$suffix = "165";
|
||||
|
||||
##################################################################
|
||||
# Copies tree into target folder, preprocess .phps
|
||||
##################################################################
|
||||
|
||||
sub process_dir($$) {
|
||||
my ($from,$to) = @_;
|
||||
opendir(DIR, $from) || die "can't opendir $from: $!";
|
||||
my @content = readdir(DIR);
|
||||
closedir DIR;
|
||||
mkdir $to;
|
||||
|
||||
for(grep { -f "$from/$_" && ($_ !~ /^\./ || $_ eq ".htaccess" || $_ eq ".keep") } @content) {
|
||||
my ($source,$target) = ("$from/$_","$to/$_");
|
||||
|
||||
open (IN,"$source");
|
||||
binmode(IN);
|
||||
open (OUT,">$target");
|
||||
binmode(OUT);
|
||||
print OUT $buffer while (read (IN,$buffer,65536));
|
||||
}
|
||||
|
||||
for(grep { -d "$from/$_" && $_ !~ /^\./ } @content) {
|
||||
process_dir("$from/$_","$to/$_");
|
||||
}
|
||||
}
|
||||
|
||||
##################################################################
|
||||
# Main
|
||||
##################################################################
|
||||
|
||||
`rm -rf $targetFolder`;
|
||||
die "Target folder exists: $targetFolder" if -e $targetFolder;
|
||||
|
||||
process_dir("./webim", $targetFolder);
|
||||
|
||||
`rm -rf release$suffix`;
|
||||
die "release folder exists: release$suffix" if -e "release$suffix";
|
||||
mkdir "release$suffix";
|
||||
|
||||
chdir "$targetFolder";
|
||||
|
||||
`zip -r ../release$suffix/mibew${suffix}_all.zip * .htaccess`;
|
||||
|
||||
chdir "locales";
|
||||
|
||||
foreach $locale qw ( ar be bg ca cs da de el fa fi fr he hr hu id it ka lv nl pl pt-br pt-pt ro ru sp sv th tr ua zh-cn zh-tw ) {
|
||||
|
||||
`zip -r ../../release$suffix/mibew${suffix}_$locale.zip $locale`;
|
||||
`rm -rf $locale`;
|
||||
|
||||
}
|
||||
|
||||
chdir "..";
|
||||
`zip -r ../release$suffix/mibew$suffix.zip * .htaccess`;
|
||||
|
||||
chdir "..";
|
||||
`rm -rf $targetFolder`;
|
@ -1,56 +0,0 @@
|
||||
#!/usr/bin/perl
|
||||
|
||||
$sourceFolder = "../webim";
|
||||
|
||||
sub file_content($) {
|
||||
my $input = $_[0];
|
||||
open( IN1, "< $input" ) or die "cannot find file $input";
|
||||
$/ = EOI;
|
||||
$content = <IN1>;
|
||||
$content =~ s/\r//g;
|
||||
close( IN1 );
|
||||
return $content;
|
||||
}
|
||||
|
||||
$php_header = file_content("header.txt");
|
||||
$php_header =~ s/\s+$//;
|
||||
|
||||
@allfiles = ();
|
||||
|
||||
sub process_folder($) {
|
||||
my($from) = @_;
|
||||
|
||||
opendir(DIR, $from) || die "can't opendir $from: $!";
|
||||
my @content = readdir(DIR);
|
||||
closedir DIR;
|
||||
|
||||
for(grep { -f "$from/$_" && ($_ !~ /^\./ || $_ eq ".htaccess") } @content) {
|
||||
push @allfiles, "$from/$_";
|
||||
}
|
||||
for(grep { -d "$from/$_" && $_ !~ /^\./ } @content) {
|
||||
process_folder("$from/$_");
|
||||
}
|
||||
}
|
||||
|
||||
process_folder($sourceFolder);
|
||||
|
||||
P: for $phpfile (grep { /\.php$/ } @allfiles) {
|
||||
$content = file_content($phpfile);
|
||||
$content =~ s/\s+$//g;
|
||||
die "not a php: $phpfile" unless $content =~ /^<\?php\n(\/\*.*?\*\/)?/s;
|
||||
die "no comment in $phpfile" unless defined($1);
|
||||
$comment = $1;
|
||||
if($comment =~ /\[external\]/) {
|
||||
next P;
|
||||
};
|
||||
$newcomment = "$php_header";
|
||||
$newcomment =~ s/^/ * /gm;
|
||||
$newcomment =~ s/\s+$//gm;
|
||||
$newcomment = "/*\n$newcomment\n */";
|
||||
|
||||
$content =~ s/^(<\?php\n)\/\*.*?\*\//$1$newcomment/s;
|
||||
|
||||
open( OUT, "> $phpfile" ) or die "cannot write file: $phpfile\n";
|
||||
print OUT $content;
|
||||
close( OUT );
|
||||
}
|
@ -1,33 +0,0 @@
|
||||
#!/usr/bin/perl
|
||||
|
||||
sub sort_transl($) {
|
||||
my($from) = @_;
|
||||
my @translation = ();
|
||||
my $header = "";
|
||||
open(IN, "$from");
|
||||
while(<IN>) {
|
||||
chomp;
|
||||
my $curr = $_;
|
||||
if(/^([\w\.]+)=(.*)$/) {
|
||||
if($1 ne "encoding" && $1 ne "output_charset" && $1 ne "output_encoding") {
|
||||
push @translation, $curr;
|
||||
} else {
|
||||
$header .= "$curr\n";
|
||||
}
|
||||
} else {
|
||||
die "wrong line in $from: $curr\n";
|
||||
}
|
||||
}
|
||||
close(IN);
|
||||
open(OUT, "> $from");
|
||||
print OUT $header;
|
||||
for$line(sort @translation) {
|
||||
print OUT "$line\n";
|
||||
}
|
||||
close(OUT);
|
||||
}
|
||||
|
||||
die "no parameter\n" if $#ARGV < 0;
|
||||
die "doesn't exists\n" unless -e $ARGV[0];
|
||||
|
||||
sort_transl($ARGV[0]);
|
@ -1,4 +0,0 @@
|
||||
<IfModule mod_security.c>
|
||||
SecFilterEngine Off
|
||||
SecFilterScanPOST Off
|
||||
</IfModule>
|
@ -1,41 +0,0 @@
|
||||
Mibew Messenger
|
||||
Copyright 2005-2013 the original author or authors.
|
||||
|
||||
REQUIREMENTS
|
||||
|
||||
* Apache web server 1.3.34 or above
|
||||
* MySQL database 5.0 or above
|
||||
* PHP 4.x or above with MySQL support
|
||||
|
||||
INSTALLATION
|
||||
|
||||
1. Create folder with name 'webim' in the root of your website.
|
||||
2. Upload all the files contained in this archive (retaining the directory structure) into created folder.
|
||||
Be sure to chromo the webim folder to 755 and the install folder to 644.
|
||||
3. Add a MySQL database with the name 'webim'
|
||||
4. Edit /webim/libs/config.php to the information needed to connect to the database
|
||||
5. Using your web browser visit http://<yourdomain>/webim/install/ and
|
||||
hit 'Create tables'
|
||||
6. Remove /webim/install/ directory from your server
|
||||
7. Logon as
|
||||
user: admin
|
||||
password: <empty>
|
||||
7. Get button code and setup it on your site.
|
||||
8. Change your password and name.
|
||||
9. Wait for your visitors on 'Pending users' page.
|
||||
|
||||
On unix/linux platforms change the owner of /webim/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 /webim/images/avatar
|
||||
(chmod 700 /webim/images/avatar).
|
||||
|
||||
UPDATE
|
||||
|
||||
1. Backup your /webim/libs/config.php
|
||||
2. Backup your /webim/images/avatar folder.
|
||||
3. Delete the items in the webim folder on the server.
|
||||
4. Upload all the files contained in the downloaded archive (retaining the directory structure) into webim folder.
|
||||
5. Re-edit the MySQL database settings you config.php
|
||||
6. Visit http://<yourdomain>/webim/install/ and follow the instructions to update database (if needed).
|
||||
7. Remove /webim/install/ directory from your server
|
||||
8. Restore contents of /webim/images/avatar folder.
|
@ -1 +0,0 @@
|
||||
Mibew/1.6.5
|
@ -1,72 +0,0 @@
|
||||
<?php
|
||||
/*
|
||||
* Copyright 2005-2013 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
require_once('libs/common.php');
|
||||
require_once('libs/chat.php');
|
||||
require_once('libs/operator.php');
|
||||
require_once('libs/groups.php');
|
||||
|
||||
$referer = isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : "";
|
||||
if($referer && isset($_SESSION['threadid'])) {
|
||||
$link = connect();
|
||||
$thread = thread_by_id_($_SESSION['threadid'], $link);
|
||||
if ($thread && $thread['istate'] != $state_closed) {
|
||||
$msg = getstring2_("chat.client.visited.page", array($referer), $thread['locale']);
|
||||
post_message_($thread['threadid'], $kind_for_agent,$msg,$link);
|
||||
}
|
||||
mysql_close($link);
|
||||
}
|
||||
|
||||
$image = verifyparam(isset($_GET['image']) ? "image" : "i", "/^\w+$/", "webim");
|
||||
$lang = verifyparam(isset($_GET['language']) ? "language" : "lang", "/^[\w-]{2,5}$/", "");
|
||||
if(!$lang || !locale_exists($lang)) {
|
||||
$lang = $current_locale;
|
||||
}
|
||||
|
||||
$groupid = verifyparam( "group", "/^\d{1,8}$/", "");
|
||||
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 = "locales/${lang}/button/${image}_${image_postfix}.gif";
|
||||
|
||||
$fp = fopen($filename, 'rb') or die("no 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,162 +0,0 @@
|
||||
<?php
|
||||
/*
|
||||
* Copyright 2005-2013 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
require_once('libs/common.php');
|
||||
require_once('libs/chat.php');
|
||||
require_once('libs/operator.php');
|
||||
require_once('libs/groups.php');
|
||||
require_once('libs/expand.php');
|
||||
require_once('libs/captcha.php');
|
||||
require_once('libs/notify.php');
|
||||
|
||||
loadsettings();
|
||||
if($settings['enablessl'] == "1" && $settings['forcessl'] == "1") {
|
||||
if(!is_secure_request()) {
|
||||
$requested = $_SERVER['PHP_SELF'];
|
||||
if($_SERVER['REQUEST_METHOD'] == 'GET' && $_SERVER['QUERY_STRING']) {
|
||||
header("Location: ".get_app_location(true,true)."/client.php?".$_SERVER['QUERY_STRING']);
|
||||
} else {
|
||||
die("only https connections are handled");
|
||||
}
|
||||
exit;
|
||||
}
|
||||
}
|
||||
|
||||
if( !isset($_GET['token']) || !isset($_GET['thread']) ) {
|
||||
|
||||
$thread = NULL;
|
||||
if( isset($_SESSION['threadid']) ) {
|
||||
$thread = reopen_thread($_SESSION['threadid']);
|
||||
}
|
||||
|
||||
if( !$thread ) {
|
||||
$groupid = "";
|
||||
$groupname = "";
|
||||
if($settings['enablegroups'] == '1') {
|
||||
$groupid = verifyparam( "group", "/^\d{1,8}$/", "");
|
||||
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['usercanchangename'] == "1" && isset($_POST['name'])) {
|
||||
$newname = getparam("name");
|
||||
if($newname != $visitor['name']) {
|
||||
$data = strtr(base64_encode(myiconv($webim_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;
|
||||
}
|
||||
|
||||
if($settings['enablepresurvey'] == '1' && !(isset($_POST['survey']) && $_POST['survey'] == 'on')) {
|
||||
$page = array();
|
||||
setup_logo();
|
||||
setup_survey($visitor['name'], $email, $groupid, $info, $referrer);
|
||||
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)),$link);
|
||||
}
|
||||
post_message_($thread['threadid'],$kind_info,getstring('chat.wait'),$link);
|
||||
if($email) {
|
||||
post_message_($thread['threadid'],$kind_for_agent,getstring2('chat.visitor.email',array($email)),$link);
|
||||
}
|
||||
if($info) {
|
||||
post_message_($thread['threadid'],$kind_for_agent,getstring2('chat.visitor.info',array($info)),$link);
|
||||
}
|
||||
if($firstmessage) {
|
||||
$postedid = post_message_($thread['threadid'],$kind_user,$firstmessage,$link,$visitor['name']);
|
||||
commit_thread( $thread['threadid'], array('shownmessageid' => $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: $webimroot/client.php?thread=$threadid&token=$token&level=$level".($chatstyle ? "&style=$chatstyle" : ""));
|
||||
exit;
|
||||
}
|
||||
|
||||
$token = verifyparam( "token", "/^\d{1,8}$/");
|
||||
$threadid = verifyparam( "thread", "/^\d{1,8}$/");
|
||||
$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");
|
||||
}
|
||||
|
||||
?>
|
@ -1,917 +0,0 @@
|
||||
/*
|
||||
* Copyright 2005-2013 Evgeny Gryaznov
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
/* reset all */
|
||||
|
||||
html, body, div, h1, h2, h3, h4, h5, h6, ul, ol, dl, li, dt, dd, p, blockquote, pre, form, fieldset, table, th, td { margin: 0; padding: 0; }
|
||||
table { border-collapse:collapse; border-spacing:0; }
|
||||
fieldset,img { border:0; }
|
||||
ol,ul { list-style:none; }
|
||||
h1,h2,h3,h4,h5,h6 { font-size:100%; font-weight:normal; }
|
||||
q:before,q:after { content:''; }
|
||||
|
||||
body {
|
||||
background: #FFFFFF url(images/header.gif) repeat-x;
|
||||
font-family: "Trebuchet MS", Arial, Helvetica, sans-serif;
|
||||
font-size: 0.8em;
|
||||
line-height: 140%;
|
||||
color: #333333;
|
||||
}
|
||||
|
||||
/* 100% height with footer, 200 px sidebar */
|
||||
|
||||
html, body {
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
body {
|
||||
min-width: 750px;
|
||||
}
|
||||
|
||||
a {
|
||||
color: #2f7599;
|
||||
}
|
||||
|
||||
#wrap400, #wrap700, #fixedwrap {
|
||||
position:relative;
|
||||
margin: 0px auto -41px;
|
||||
height:auto !important;
|
||||
height:100%;
|
||||
min-height:100%;
|
||||
}
|
||||
|
||||
#wrap400 {
|
||||
width: 100%;
|
||||
min-width:450px;
|
||||
}
|
||||
|
||||
#wrap700 {
|
||||
width: 100%;
|
||||
min-width:750px;
|
||||
}
|
||||
|
||||
#fixedwrap {
|
||||
width: 750px;
|
||||
}
|
||||
|
||||
.contentdiv {
|
||||
float:left;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.contentinner {
|
||||
margin-right: 210px;
|
||||
padding: 10px 60px 10px 20px;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.contentnomenu {
|
||||
padding: 10px 60px 10px 20px;
|
||||
}
|
||||
|
||||
.empty_inner {
|
||||
height:40px;
|
||||
}
|
||||
|
||||
#footer {
|
||||
background: white url(images/footer.gif) bottom repeat-x;
|
||||
font-size:11px;
|
||||
position:relative;
|
||||
|
||||
min-height: 40px;
|
||||
height:40px;
|
||||
vertical-align:middle;
|
||||
|
||||
width:100%;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
#legal {
|
||||
clear: both;
|
||||
line-height: 30px;
|
||||
padding-top:10px;
|
||||
text-align: center;
|
||||
color: #375C69;
|
||||
margin-bottom: 0px;
|
||||
}
|
||||
|
||||
#footer .flink {
|
||||
color: #2f7599;
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
#togglediv {
|
||||
float:right;
|
||||
padding-right:10px;
|
||||
}
|
||||
|
||||
/* Header */
|
||||
|
||||
#header {
|
||||
width: 100%;
|
||||
height: 32px;
|
||||
margin: 0px -2px 10px 0px;
|
||||
padding-top: 10px;
|
||||
padding-bottom: 5px;
|
||||
background: url(images/graydot.gif) repeat-x left bottom;
|
||||
display: block;
|
||||
}
|
||||
|
||||
#header {
|
||||
float: left;
|
||||
}
|
||||
|
||||
img.left {
|
||||
float: left;
|
||||
margin-right: 15px;
|
||||
}
|
||||
|
||||
#header h1 {
|
||||
font-size: 2em;
|
||||
line-height: 32px;
|
||||
color: #494949;
|
||||
margin-left: 40px;
|
||||
}
|
||||
|
||||
#header h1 a {
|
||||
color: #494949;
|
||||
}
|
||||
|
||||
#header a {
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
#title {
|
||||
float: left;
|
||||
display: inline;
|
||||
}
|
||||
|
||||
#path {
|
||||
float: right;
|
||||
padding: 10px 20px 0px 0px;
|
||||
line-height: 22px;
|
||||
display: inline;
|
||||
}
|
||||
|
||||
/* Sidebar */
|
||||
|
||||
#sidebar {
|
||||
float: left;
|
||||
width: 185px;
|
||||
margin-left: -210px;
|
||||
margin-top: 20px;
|
||||
position:relative;
|
||||
line-height: 180%
|
||||
}
|
||||
|
||||
#sidebar ul {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
list-style: none;
|
||||
}
|
||||
|
||||
#sidebar li {
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
#sidebar li ul {
|
||||
}
|
||||
|
||||
#sidebar li li {
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
#sidebar h2 {
|
||||
text-transform: lowercase;
|
||||
margin-bottom: 10px;
|
||||
background: url(images/graydot.gif) repeat-x left bottom;
|
||||
font-size: 1.3em;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.locales a {
|
||||
color: #2f7599;
|
||||
font-size: 1em;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.locales .active a {
|
||||
color: #555;
|
||||
}
|
||||
|
||||
.locales a:hover {
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
.submenu a {
|
||||
padding-left: 15px;
|
||||
color: #2f7599;
|
||||
font-size: 1em;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.submenu a.inner { padding-left: 0px; }
|
||||
.submenu span.small { font-size: 80%; padding-left: 5px; }
|
||||
|
||||
.submenu .active a {
|
||||
background: url(images/li.gif) no-repeat left 1px;
|
||||
color: #555;
|
||||
}
|
||||
|
||||
.submenu .active a.inner {
|
||||
background: none;
|
||||
}
|
||||
|
||||
.submenu a:hover {
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
/* form, tabbed form */
|
||||
|
||||
.mform {
|
||||
background: url(images/loginbg.gif);
|
||||
clear: both;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.tabs {
|
||||
float: right;
|
||||
margin-left: 15px;
|
||||
display: inline;
|
||||
margin-right: 15px;
|
||||
}
|
||||
|
||||
.tabs li {
|
||||
display: inline;
|
||||
}
|
||||
|
||||
.tabs a {
|
||||
display: block;
|
||||
float: left;
|
||||
padding: 2px 9px 3px 9px;
|
||||
font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;
|
||||
font-size: 11px;
|
||||
color: #2f7599;
|
||||
}
|
||||
|
||||
.tabs li.active a {
|
||||
background: url(images/loginbg.gif);
|
||||
border-left:1px solid #bbbbbb;border-top:1px solid #bbbbbb;border-right:1px solid #bbbbbb;
|
||||
color: #000;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.formtop, .formbottom, .formtopi, .formbottomi { height: 15px;}
|
||||
.formtop { background: url(images/logincrnrt.gif) no-repeat top right;}
|
||||
.formtopi { background: url(images/logincrnlt.gif) no-repeat top left; }
|
||||
.formbottom { background: url(images/logincrnrb.gif) no-repeat bottom right; }
|
||||
.formbottomi { background: url(images/logincrnlb.gif) no-repeat bottom left; }
|
||||
.forminner { margin: 0px 15px;}
|
||||
.forminner p { margin-bottom: 1em; }
|
||||
|
||||
/* fieldForm */
|
||||
|
||||
.fieldForm {
|
||||
font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;
|
||||
font-size: 11px;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.packedFormField {
|
||||
font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;
|
||||
font-size: 11px;
|
||||
float:left;
|
||||
margin-right:25px;
|
||||
margin-bottom:8px;
|
||||
}
|
||||
|
||||
.packedFormField select {
|
||||
min-width: 130px;
|
||||
}
|
||||
|
||||
div.errinfo {
|
||||
color: #c13030;
|
||||
}
|
||||
|
||||
.field {
|
||||
width: 100%;
|
||||
margin-top: 5px;
|
||||
}
|
||||
|
||||
.flabel {
|
||||
position: relative;
|
||||
margin: 8px auto 2px;
|
||||
color: black;
|
||||
}
|
||||
|
||||
.fleftlabel {
|
||||
float: left;
|
||||
width: 11em;
|
||||
}
|
||||
|
||||
.flabel span.required {
|
||||
font-size:8.0pt;
|
||||
color:red;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.field .subfield {
|
||||
padding-left: 30px;
|
||||
background: url(images/subitem.gif) no-repeat 10px 2px;
|
||||
}
|
||||
|
||||
.fieldinrow {
|
||||
min-width: 300px;
|
||||
display: inline;
|
||||
float:left;
|
||||
width: 45%;
|
||||
}
|
||||
|
||||
.fvalue {
|
||||
float: left;
|
||||
}
|
||||
|
||||
.fvaluewithta {
|
||||
float: left;
|
||||
width: 67%;
|
||||
}
|
||||
|
||||
.fvaluewithta textarea {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.fvaluenodesc {
|
||||
}
|
||||
|
||||
.fvalueframe {
|
||||
overflow: auto;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.fvalueframe iframe {
|
||||
border: solid 1px #999;
|
||||
}
|
||||
|
||||
.fdescr {
|
||||
float:left;
|
||||
padding-left:10px;
|
||||
color: #676767;
|
||||
font-size: 10px;
|
||||
min-width: 200px;
|
||||
}
|
||||
|
||||
.fbutton {
|
||||
background: url(images/formline.gif) repeat-x;
|
||||
margin-top: 20px;
|
||||
padding-top: 10px;
|
||||
}
|
||||
|
||||
.fbutton .links {
|
||||
float: right;
|
||||
margin-top: 5px;
|
||||
}
|
||||
|
||||
.fbutton .submitbutton {
|
||||
float: left;
|
||||
}
|
||||
|
||||
.formauth {
|
||||
}
|
||||
|
||||
textarea.wide {
|
||||
border:1px solid #878787;
|
||||
overflow:auto;
|
||||
width: 95%;
|
||||
}
|
||||
|
||||
input.formauth {
|
||||
border: 1px solid #878787;
|
||||
color: #333;
|
||||
margin-right:15px;
|
||||
padding-right: 0px;
|
||||
}
|
||||
|
||||
#formmessage {
|
||||
border: 1px solid #4C96D4;
|
||||
background-color: #E7F1F9;
|
||||
padding: 8px 11px;
|
||||
font-size: 0.85em;
|
||||
font-weight:bold;
|
||||
max-width: 700px;
|
||||
margin: -10px 2px 10px;
|
||||
color: #515151;
|
||||
}
|
||||
|
||||
#offwarn {
|
||||
border: 1px solid #4CD496;
|
||||
background-color: #E7F9F1;
|
||||
color: #515151;
|
||||
padding: 8px 11px;
|
||||
font-size: 0.85em;
|
||||
font-weight:bold;
|
||||
line-height: 140%;
|
||||
margin: 0px;
|
||||
}
|
||||
|
||||
#offwarn img {
|
||||
margin-top: .4em;
|
||||
float: left;
|
||||
padding-right: 10px;
|
||||
}
|
||||
|
||||
.asterisk {
|
||||
padding: 10px 20px;
|
||||
}
|
||||
|
||||
/* tables */
|
||||
|
||||
.tabletool {
|
||||
float: right;
|
||||
}
|
||||
|
||||
.tabletool a {
|
||||
color: #296685;
|
||||
vertical-align: top;
|
||||
padding-left: 4px;
|
||||
}
|
||||
|
||||
.tabletitle {
|
||||
background: url(images/graydot.gif) repeat-x left bottom;
|
||||
font-family: "Lucida Sans Unicode", "Lucida Grande", Sans-Serif;
|
||||
font-size: 1.4em;
|
||||
margin: 10px 0px 20px;
|
||||
padding-bottom: 10px;
|
||||
color: #1D485E;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
table.list, table.translate, table.statistics {
|
||||
font-family: "Lucida Sans Unicode", "Lucida Grande", Sans-Serif;
|
||||
background: #fff;
|
||||
width: 100%;
|
||||
border-collapse: collapse;
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
table.list th, table.translate th, table.statistics th {
|
||||
font-size: 1.2em;
|
||||
font-weight: normal;
|
||||
padding: 10px 8px;
|
||||
border-bottom: 2px solid #2F7598;
|
||||
}
|
||||
|
||||
table.list th, table.translate th { color: #1D485E; }
|
||||
table.statistics th { color: #2F7598; }
|
||||
|
||||
table.list td, table.statistics td {
|
||||
color: #2f7599;
|
||||
padding: 10px 8px;
|
||||
border-bottom: 1px solid #ccc;
|
||||
}
|
||||
|
||||
table.translate td {
|
||||
font-family: Arial, Helvetica, sans-serif;
|
||||
font-size: 12px;
|
||||
color: #515151;
|
||||
padding: 2px 8px;
|
||||
border-bottom: 1px solid #ccc;
|
||||
}
|
||||
|
||||
table.list td a.man {
|
||||
background: url(images/tbliclogin.gif) no-repeat left center;
|
||||
padding-left: 15px;
|
||||
}
|
||||
|
||||
table.list td a.mail {
|
||||
background: url(images/mail.png) no-repeat left center;
|
||||
padding-left: 24px;
|
||||
}
|
||||
|
||||
table.list td a.xmpp {
|
||||
background: url(images/xmpp.png) no-repeat left center;
|
||||
padding-left: 24px;
|
||||
}
|
||||
|
||||
table.list tbody tr:hover td, table.list tbody tr:hover td a, table.statistics tbody tr:hover td {
|
||||
color: #1D485E;
|
||||
}
|
||||
|
||||
/* awaiting */
|
||||
|
||||
table.awaiting {
|
||||
font-family: "Lucida Sans Unicode", "Lucida Grande", Sans-Serif;
|
||||
background: #fff;
|
||||
width: 100%;
|
||||
border-collapse: collapse;
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
table.awaiting th {
|
||||
font-size: 1.2em;
|
||||
font-weight: normal;
|
||||
color: #1D485E;
|
||||
padding: 10px 8px;
|
||||
border-bottom: 2px solid #2F7598;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
table.awaiting th.first {
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
table.awaiting table.inner {
|
||||
border: none;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
table.awaiting table.inner .icon {
|
||||
width: 30px;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
table.awaiting td.visitor {
|
||||
color: #296685;
|
||||
border-bottom: 1px solid #ccc;
|
||||
padding: 10px 8px;
|
||||
margin: 0px;
|
||||
}
|
||||
|
||||
.awaiting .visitor a { color: #296685; }
|
||||
.awaiting tr:hover .visitor, .awaiting tr:hover .visitor a { color: #1D485E; }
|
||||
|
||||
.awaiting tr.ban .visitor, .awaiting tr.ban .visitor a { color: #9AC8E0; }
|
||||
.awaiting tr.ban:hover .visitor, .awaiting tr.ban:hover .visitor a { color: #4C9CC8; }
|
||||
|
||||
.awaiting tr.inwait .visitor, .awaiting tr.inwait a { font-weight: bold; }
|
||||
.awaiting tr.inprio .visitor, .awaiting tr.inprio a { font-weight: bold; font-size: 1.05em; }
|
||||
.awaiting tr.inchat .visitor, .awaiting tr.inchat .visitor a { color: #777; }
|
||||
.awaiting tr.inchat:hover .visitor, .awaiting tr.inchat:hover .visitor a { color: #444; }
|
||||
.awaiting tr.inchat a { text-decoration: none; }
|
||||
|
||||
.firstmessage {
|
||||
text-align: right;
|
||||
font-size: 0.8em;
|
||||
padding-right: 10px;
|
||||
}
|
||||
|
||||
.firstmessage a {
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.firstmessage a:hover {
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
#connstatus {
|
||||
float:right;
|
||||
margin: 10px 10px;
|
||||
}
|
||||
|
||||
#connlinks {
|
||||
margin: 10px 10px;
|
||||
}
|
||||
|
||||
#connlinks a {
|
||||
color: #777;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
#connlinks a:hover {
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
/* online operators */
|
||||
|
||||
#onlineoperators {
|
||||
padding-right: 10px;
|
||||
float: right;
|
||||
}
|
||||
|
||||
/* search */
|
||||
|
||||
#searchtext {
|
||||
float:left;
|
||||
display: inline;
|
||||
margin:7px 20px 5px 0px;
|
||||
width:75%;
|
||||
padding-right:5px;
|
||||
}
|
||||
|
||||
.searchctrl {
|
||||
float: left;
|
||||
margin:7px 20px 5px 0px;
|
||||
padding-right:5px;
|
||||
display: inline;
|
||||
}
|
||||
|
||||
#searchtext input {
|
||||
width: 100%;
|
||||
margin: 0px;
|
||||
}
|
||||
|
||||
#searchbutton {
|
||||
float:left;
|
||||
}
|
||||
|
||||
/* login */
|
||||
|
||||
#loginsmallpane {
|
||||
float: right;
|
||||
padding: 10px 15px 0px 0px;
|
||||
margin-right: 0px;
|
||||
line-height: 22px;
|
||||
display: inline;
|
||||
}
|
||||
|
||||
#loginsmallpane input {
|
||||
margin: 0px 3px;
|
||||
padding: 0px 2px;
|
||||
}
|
||||
|
||||
#loginsmallpane .butt {
|
||||
height: 1.3em;
|
||||
border: 0px;
|
||||
background: none;
|
||||
}
|
||||
|
||||
#loginsmallpane .butt:hover {
|
||||
background: #aaa;
|
||||
}
|
||||
|
||||
#loginintro {
|
||||
width: 400px;
|
||||
margin: 10px 30px;
|
||||
}
|
||||
|
||||
#loginpane {
|
||||
width: 400px;
|
||||
margin: 30px 30px;
|
||||
}
|
||||
|
||||
#loginpane .header h2 {
|
||||
font-size: 2em;
|
||||
margin-bottom: 0.9em;
|
||||
padding-bottom: 0.8em;
|
||||
border-bottom: 2px solid #2F7598;
|
||||
}
|
||||
|
||||
/* nice button */
|
||||
|
||||
#confirmpane {
|
||||
width:450px;
|
||||
margin:0px auto 5px;
|
||||
padding-top: 70px;
|
||||
}
|
||||
|
||||
.nicebutton {
|
||||
border: none;
|
||||
float: left;
|
||||
margin-left: 30px;
|
||||
}
|
||||
|
||||
.submit a {
|
||||
font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;
|
||||
font-size: 11px;
|
||||
line-height: 35px;
|
||||
color: #000000;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.submit {
|
||||
background: url(images/submitbg.gif) repeat-x;
|
||||
vertical-align: top;
|
||||
}
|
||||
|
||||
|
||||
/* thread log */
|
||||
|
||||
.logpane {
|
||||
margin: 10px 0px;
|
||||
line-height: 150%;
|
||||
}
|
||||
|
||||
.logpane .header {
|
||||
padding-bottom: 0.8em;
|
||||
border-bottom: 2px solid #2F7598;
|
||||
}
|
||||
|
||||
.logpane .wlabel {
|
||||
width: 10em;
|
||||
float: left;
|
||||
margin-right:10px;
|
||||
}
|
||||
|
||||
.logpane .wvalue {
|
||||
float: left;
|
||||
}
|
||||
|
||||
/* dashboard */
|
||||
|
||||
#dashboard {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.dashitem {
|
||||
width:33%;
|
||||
margin: 0px 2em 5em 0px;
|
||||
padding: 5px 2em 5em;
|
||||
vertical-align: top;
|
||||
}
|
||||
|
||||
.dashitem:hover {
|
||||
}
|
||||
|
||||
.dashitem a {
|
||||
padding-top:2px;
|
||||
padding-bottom: 10px;
|
||||
display: block;
|
||||
}
|
||||
|
||||
.dashitem img, #dashlocalesPopup h2 img {
|
||||
float: left;
|
||||
padding-right:10px;
|
||||
width: 24px;
|
||||
height: 24px;
|
||||
}
|
||||
|
||||
#dashlocalesPopup h2 img {
|
||||
margin-top: -3px;
|
||||
}
|
||||
|
||||
#dashlocalesPopup .locales {
|
||||
line-height: 180%;
|
||||
margin-left:10px;
|
||||
}
|
||||
|
||||
#dashlocalesPopup h2 {
|
||||
font-size: 1.5em;
|
||||
margin-bottom: 0.9em;
|
||||
padding: 5px 30px 0.8em 0px;
|
||||
border-bottom: 2px solid #2F7598;
|
||||
}
|
||||
|
||||
#dashlocalesPopupClose {
|
||||
float: right;
|
||||
position:absolute;
|
||||
right:5px;
|
||||
top:5px;
|
||||
}
|
||||
|
||||
#dashlocalesPopup {
|
||||
display:none;
|
||||
position:fixed;
|
||||
_position:absolute; /* ie6*/
|
||||
background:#FFFFFF;
|
||||
border:2px solid #2F7598;
|
||||
z-index:110;
|
||||
padding:1em 1em;
|
||||
font-size:1em;
|
||||
}
|
||||
|
||||
#backgroundPopup{
|
||||
display:none;
|
||||
position:fixed;
|
||||
_position:absolute; /* ie6*/
|
||||
height:100%;
|
||||
opacity: .5;
|
||||
width:100%;
|
||||
top:0;
|
||||
left:0;
|
||||
background:#000000;
|
||||
border:1px solid #cecece;
|
||||
z-index:101;
|
||||
}
|
||||
|
||||
/* install */
|
||||
|
||||
#install li {
|
||||
list-style-type: circle;
|
||||
list-style-position: inside;
|
||||
margin-left: 2em;
|
||||
}
|
||||
|
||||
#check-nv, #check-nm {
|
||||
color: #2f7599;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
#check-nv:hover, #check-nm:hover {
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
|
||||
/* chat */
|
||||
|
||||
.message {
|
||||
font-family: Arial, Helvetica, sans-serif;
|
||||
font-size: 12px;
|
||||
color: #4F4F4F;
|
||||
padding: 15px 0px 0px 0px;
|
||||
line-height: 17px;
|
||||
}
|
||||
|
||||
.message span.time {
|
||||
color: #000000;
|
||||
}
|
||||
|
||||
.message span.nuser {
|
||||
color: #B11E23;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.message span.nagent {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.message span.minf {
|
||||
color: #1E48B1;
|
||||
font-size: 11px;
|
||||
}
|
||||
|
||||
.message span.mevent {
|
||||
color: #A1A1A1;
|
||||
font-size: 11px;
|
||||
}
|
||||
|
||||
.message span.mhidden {
|
||||
color: #A1A1A1;
|
||||
font-size: 11px;
|
||||
}
|
||||
|
||||
.message span.mconn {
|
||||
color: #A1A1A1;
|
||||
font-size: 11px;
|
||||
}
|
||||
|
||||
/* updates */
|
||||
|
||||
#news {
|
||||
font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;
|
||||
font-size: 11px;
|
||||
margin-bottom:15px;
|
||||
padding:4px;
|
||||
}
|
||||
|
||||
.newstext {
|
||||
margin-bottom:1em;
|
||||
}
|
||||
|
||||
/* rtl rules */
|
||||
|
||||
.lrtl .dashitem img, .lrtl #dashlocalesPopup h2 img, .lrtl #offwarn img {
|
||||
float: right;
|
||||
padding-right:0px;
|
||||
padding-left:10px;
|
||||
}
|
||||
|
||||
.lrtl .fleftlabel {
|
||||
float: right;
|
||||
width: 11em;
|
||||
}
|
||||
|
||||
.lrtl .fdescr {
|
||||
float:right;
|
||||
padding-right:10px;
|
||||
}
|
||||
|
||||
|
||||
.lrtl .field .subfield {
|
||||
padding-right: 30px;
|
||||
background: url(images/subitem_rtl.gif) no-repeat 99% 2px;
|
||||
}
|
||||
|
||||
|
||||
.lrtl .fvalue {
|
||||
float: right;
|
||||
}
|
||||
|
||||
.lrtl .logpane .wlabel {
|
||||
float: right;
|
||||
margin-left:10px;
|
||||
}
|
||||
|
||||
.lrtl .logpane .wvalue {
|
||||
float: right;
|
||||
}
|
||||
|
||||
.lrtl .fvaluewithta {
|
||||
float: right;
|
||||
}
|
||||
|
||||
.lrtl #togglediv {
|
||||
float:left;
|
||||
padding-left:10px;
|
||||
}
|
Before Width: | Height: | Size: 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: 1.4 KiB |
Before Width: | Height: | Size: 796 B |
Before Width: | Height: | Size: 328 B |
Before Width: | Height: | Size: 331 B |
@ -1,229 +0,0 @@
|
||||
<?php
|
||||
/*
|
||||
* Copyright 2005-2013 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
$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, $webimroot;
|
||||
$page = array(
|
||||
'version' => $version,
|
||||
'localeLinks' => get_locale_links("$webimroot/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-2013 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
require_once('../libs/common.php');
|
||||
require_once('../libs/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: $webimroot/install/index.php");
|
||||
exit;
|
||||
?>
|
@ -1,312 +0,0 @@
|
||||
<?php
|
||||
/*
|
||||
* Copyright 2005-2013 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
require_once('../libs/common.php');
|
||||
require_once('../libs/settings.php');
|
||||
require_once('dbinfo.php');
|
||||
|
||||
$page = array(
|
||||
'version' => $version,
|
||||
'localeLinks' => get_locale_links("$webimroot/install/index.php")
|
||||
);
|
||||
|
||||
$page['done'] = array();
|
||||
$page['nextstep'] = false;
|
||||
$page['nextnotice'] = false;
|
||||
$page['soundcheck'] = false;
|
||||
$errors = array();
|
||||
|
||||
function check_webimroot()
|
||||
{
|
||||
global $page, $errors, $webimroot;
|
||||
$requestUri = $_SERVER["REQUEST_URI"];
|
||||
if (!preg_match('/^(.*)\\/install(\\/[^\\/\\\\]*)?$/', $requestUri, $matches)) {
|
||||
$errors[] = "Cannot detect application location: $requestUri";
|
||||
return false;
|
||||
}
|
||||
$applocation = $matches[1];
|
||||
|
||||
if ($applocation != $webimroot) {
|
||||
$errors[] = "Please, check file ${applocation}/libs/config.php<br/>Wrong value of \$webimroot variable, should be \"$applocation\"";
|
||||
$webimroot = $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, $webimroot;
|
||||
|
||||
$packageFile = dirname(__FILE__) . "/package";
|
||||
$fp = @fopen($packageFile, "r");
|
||||
if ($fp === FALSE) {
|
||||
$errors[] = getlocal2("install.cannot_read", array("$webimroot/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("$webimroot/$file"));
|
||||
$errors[] = getlocal2("install.check_permissions", array(fpermissions($relativeName)));
|
||||
} else {
|
||||
$errors[] = getlocal2("install.no_file", array("$webimroot/$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("$webimroot/$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, $webimroot;
|
||||
$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, $webimroot;
|
||||
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'] = "$webimroot/install/dbperform.php?act=createdb";
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
function check_tables($link)
|
||||
{
|
||||
global $dbtables, $page, $webimroot;
|
||||
$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'] = "$webimroot/install/dbperform.php?act=ct";
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
function check_columns($link)
|
||||
{
|
||||
global $dbtables, $dbtables_can_update, $errors, $page, $webimroot;
|
||||
|
||||
$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'] = "$webimroot/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'] = "$webimroot/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 check_status()
|
||||
{
|
||||
global $page, $webimroot, $settings, $dbversion;
|
||||
|
||||
$page['done'][] = getlocal2("install.0.php", array(phpversion()));
|
||||
|
||||
if (!check_webimroot()) {
|
||||
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;
|
||||
}
|
||||
|
||||
check_sound();
|
||||
|
||||
$page['done'][] = getlocal("installed.message");
|
||||
|
||||
if (!check_admin($link)) {
|
||||
$page['nextstep'] = getlocal("installed.login_link");
|
||||
$page['nextnotice'] = getlocal2("installed.notice", array("${webimroot}/install/"));
|
||||
$page['nextstepurl'] = "$webimroot/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,186 +0,0 @@
|
||||
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-2013 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.webimRoot+'/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.webimRoot+"/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(){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.webimRoot=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-2013 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.webimNews) == "undefined" || typeof(window.webimNews.length) == "undefined")
|
||||
return;
|
||||
|
||||
var str = "<div>";
|
||||
for (var i = 0; i < window.webimNews.length; i++) {
|
||||
str += "<div class=\"newstitle\"><a hre" + "f=\"" + window.webimNews[i].link + "\">" + window.webimNews[i].title + "</a>, <span class=\"small\">" + window.webimNews[i].date + "</span></div>";
|
||||
str += "<div class=\"newstext\">" + window.webimNews[i].message+"</div>";
|
||||
}
|
||||
$("#news").html(str + "</div>");
|
||||
}
|
||||
|
||||
function loadVersion() {
|
||||
if(typeof(window.webimLatest) == "undefined" || typeof(window.webimLatest.version) == "undefined")
|
||||
return;
|
||||
|
||||
var current = $("#cver").html();
|
||||
|
||||
if(current != window.webimLatest.version) {
|
||||
if(current < window.webimLatest.version) {
|
||||
$("#cver").css("color","red");
|
||||
}
|
||||
$("#lver").html(window.webimLatest.version+", Download <a href=\""+window.webimLatest.download+"\">"+window.webimLatest.title+"</a>");
|
||||
} else {
|
||||
$("#cver").css("color","green");
|
||||
$("#lver").html(window.webimLatest.version);
|
||||
}
|
||||
}
|
||||
|
||||
$(function(){
|
||||
loadNews();
|
||||
loadVersion();
|
||||
});
|
@ -1,27 +0,0 @@
|
||||
/*
|
||||
This file is part of Mibew Messenger project.
|
||||
http://mibew.org
|
||||
|
||||
Copyright (c) 2005-2013 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="'+webimRoot+'/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="'+webimRoot+'/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(webimRoot+"/operator/ban.php?"+
|
||||
(b?"id="+b:"thread="+a),localized[2],"ban"+a,'<img src="'+webimRoot+'/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(webimRoot+"/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="'+webimRoot+"/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 webimRoot="";Behaviour.register({"#togglemenu":function(a){a.onclick=function(){togglemenu()}}});
|
||||
EventHelper.register(window,"onload",function(){webimRoot=updaterOptions.wroot;new Ajax.ThreadListUpdater({table:$("threadlist"),status:$("connstatus"),istatus:0}.extend(updaterOptions||{}));updaterOptions.havemenu||togglemenu()});
|
154
src/messenger/webim/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);
|
@ -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="webim.location" value="../165" />
|
||||
|
||||
<target name="update">
|
||||
<java jar="${closure.c}" fork="true">
|
||||
<arg value="--module_output_path_prefix"/>
|
||||
<arg value="${webim.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,397 +0,0 @@
|
||||
/**
|
||||
* @preserve This file is part of Mibew Messenger project.
|
||||
* http://mibew.org
|
||||
*
|
||||
* Copyright (c) 2005-2013 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.webimRoot+"/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.webimRoot+'/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() {
|
||||
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.webimRoot = 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 || {} ));
|
||||
});
|
@ -1,521 +0,0 @@
|
||||
/**
|
||||
* @preserve This file is part of Mibew Messenger project.
|
||||
* http://mibew.org
|
||||
*
|
||||
* Copyright (c) 2005-2013 Mibew Messenger Community
|
||||
* License: http://mibew.org/license.php
|
||||
*/
|
||||
|
||||
/*
|
||||
* common.js Based on Prototype JavaScript framework, version 1.3.1
|
||||
* http://prototype.conio.net/ (c) 2005 Sam Stephenson <sam@conio.net>
|
||||
*/
|
||||
|
||||
//- getEl, myAgent, myRealAgent
|
||||
|
||||
//- localized
|
||||
|
||||
//- onComplete, showonline
|
||||
//- threadParams, servl, frequency, user, threadid, token, cssfile
|
||||
//- updaterOptions, url, company, agentservl, noclients, wroot, havemenu, showpopup, ignorectrl, istatus
|
||||
|
||||
|
||||
var Class = {
|
||||
create: function() {
|
||||
return function() {
|
||||
this.initialize.apply(this, arguments);
|
||||
};
|
||||
},
|
||||
|
||||
inherit: function(child,parent,body) {
|
||||
Object.extend(Object.extend(child.prototype, parent.prototype), body );
|
||||
}
|
||||
};
|
||||
|
||||
Object.extend = function(destination, source) {
|
||||
for (property in source) {
|
||||
destination[property] = source[property];
|
||||
}
|
||||
return destination;
|
||||
};
|
||||
|
||||
Object.prototype.extend = function(_object) {
|
||||
return Object.extend.apply(this, [this, _object]);
|
||||
};
|
||||
|
||||
Function.prototype.bind = function(_object) {
|
||||
var __method = this;
|
||||
return function() {
|
||||
return __method.apply(_object, arguments);
|
||||
}
|
||||
};
|
||||
|
||||
Function.prototype.bindAsEventListener = function(_object) {
|
||||
var __method = this;
|
||||
return function(event) {
|
||||
__method.call(_object, event || window.event);
|
||||
}
|
||||
};
|
||||
|
||||
Number.prototype.toColorPart = function() {
|
||||
var digits = this.toString(16);
|
||||
if (this < 16) return '0' + digits;
|
||||
return digits;
|
||||
};
|
||||
|
||||
var Try = {
|
||||
these: function() {
|
||||
var returnValue;
|
||||
|
||||
for (var i = 0; i < arguments.length; i++) {
|
||||
var lambda = arguments[i];
|
||||
try {
|
||||
returnValue = lambda();
|
||||
break;
|
||||
} catch (e) {}
|
||||
}
|
||||
|
||||
return returnValue;
|
||||
}
|
||||
};
|
||||
|
||||
/*--------------------------------------------------------------------------*/
|
||||
|
||||
var PeriodicalExecuter = Class.create();
|
||||
PeriodicalExecuter.prototype = {
|
||||
initialize: function(callback, frequency) {
|
||||
this.callback = callback;
|
||||
this.frequency = frequency;
|
||||
this.currentlyExecuting = false;
|
||||
|
||||
this.registerCallback();
|
||||
},
|
||||
|
||||
registerCallback: function() {
|
||||
setInterval(this.onTimerEvent.bind(this), this.frequency * 1000);
|
||||
},
|
||||
|
||||
onTimerEvent: function() {
|
||||
if (!this.currentlyExecuting) {
|
||||
try {
|
||||
this.currentlyExecuting = true;
|
||||
this.callback();
|
||||
} finally {
|
||||
this.currentlyExecuting = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
/*--------------------------------------------------------------------------*/
|
||||
|
||||
function findObj( id )
|
||||
{
|
||||
var x;
|
||||
if( !( x = document[ id ] ) && document.all ) x = document.all[ id ];
|
||||
if( !x && document.getElementById ) x = document.getElementById( id );
|
||||
if( !x && !document.all && document.getElementsByName )
|
||||
{
|
||||
x = document.getElementsByName( id );
|
||||
if( x.length == 0 ) return null;
|
||||
if( x.length == 1 ) return x[ 0 ];
|
||||
}
|
||||
|
||||
return x;
|
||||
}
|
||||
|
||||
if (!Array.prototype.push) {
|
||||
Array.prototype.push = function() {
|
||||
var startLength = this.length;
|
||||
for (var i = 0; i < arguments.length; i++)
|
||||
this[startLength + i] = arguments[i];
|
||||
return this.length;
|
||||
};
|
||||
}
|
||||
|
||||
function $() {
|
||||
var elems = new Array();
|
||||
|
||||
for (var i = 0; i < arguments.length; i++) {
|
||||
var elem = arguments[i];
|
||||
if (typeof elem == 'string')
|
||||
elem = findObj(elem);
|
||||
|
||||
if (arguments.length == 1)
|
||||
return elem;
|
||||
|
||||
elems.push(elem);
|
||||
}
|
||||
|
||||
return elems;
|
||||
}
|
||||
|
||||
var Ajax = {
|
||||
getTransport: function() {
|
||||
return Try.these(
|
||||
function() {return new ActiveXObject('Msxml2.XMLHTTP')},
|
||||
function() {return new ActiveXObject('Microsoft.XMLHTTP')},
|
||||
function() {return new XMLHttpRequest()}
|
||||
) || false;
|
||||
},
|
||||
|
||||
getXml: function(_response) {
|
||||
if( _response &&
|
||||
_response.status >= 200 &&
|
||||
_response.status < 300 ) {
|
||||
var xmlDoc = _response.responseXML;
|
||||
if( xmlDoc && xmlDoc.documentElement )
|
||||
return xmlDoc.documentElement;
|
||||
}
|
||||
return null;
|
||||
},
|
||||
|
||||
getError: function(_response) {
|
||||
return _response.statusText || "connection error N" + _response.status;
|
||||
},
|
||||
|
||||
emptyFunction: function() {}
|
||||
};
|
||||
|
||||
Ajax.Base = function() {};
|
||||
Ajax.Base.prototype = {
|
||||
setOptions: function(_options) {
|
||||
this._options = {
|
||||
_method: 'post',
|
||||
asynchronous: true,
|
||||
parameters: ''
|
||||
}.extend(_options || {});
|
||||
},
|
||||
|
||||
getStatus: function() {
|
||||
try {
|
||||
return this.transport.status || 0;
|
||||
} catch (e) { return 0 }
|
||||
},
|
||||
|
||||
responseIsSuccess: function() {
|
||||
var status = this.getStatus();
|
||||
return !status || (status >= 200 && status < 300);
|
||||
},
|
||||
|
||||
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(url, _options) {
|
||||
this.transport = Ajax.getTransport();
|
||||
this.setOptions(_options);
|
||||
this.transportTimer = {};
|
||||
this.finished = false;
|
||||
this.request(url);
|
||||
},
|
||||
|
||||
request: function(url) {
|
||||
var parameters = this._options.parameters || '';
|
||||
if (parameters.length > 0) parameters += '&_=';
|
||||
|
||||
try {
|
||||
if (this._options._method == 'get' && parameters.length > 0)
|
||||
url += '?' + parameters;
|
||||
|
||||
this.transport.open(this._options._method.toUpperCase(), url, this._options.asynchronous);
|
||||
|
||||
if (this._options.asynchronous) {
|
||||
this.transport.onreadystatechange = this.onStateChange.bind(this);
|
||||
if(this._options.timeout) {
|
||||
this.transportTimer = setTimeout(this.handleTimeout.bind(this), this._options.timeout);
|
||||
}
|
||||
}
|
||||
|
||||
this.setRequestHeaders();
|
||||
|
||||
var pbody = this._options.postBody ? this._options.postBody : parameters;
|
||||
this.transport.send(this._options._method == 'post' ? pbody : null);
|
||||
|
||||
} catch (e) {
|
||||
this.dispatchException(e);
|
||||
}
|
||||
},
|
||||
|
||||
setRequestHeaders: function() {
|
||||
var requestHeaders =
|
||||
['X-Requested-With', 'XMLHttpRequest'];
|
||||
|
||||
if (this._options._method == 'post') {
|
||||
requestHeaders.push('Content-type',
|
||||
'application/x-www-form-urlencoded');
|
||||
|
||||
/* Force "Connection: close" for older Mozilla browsers to work
|
||||
* around a bug where XMLHttpRequest sends an incorrect
|
||||
* Content-length header. See Mozilla Bugzilla #246651.
|
||||
*/
|
||||
if (this.transport.overrideMimeType &&
|
||||
(navigator.userAgent.match("/Gecko\/(\d{4})/") || [0,2005])[1] < 2005)
|
||||
requestHeaders.push('Connection', 'close');
|
||||
}
|
||||
|
||||
if (this._options.requestHeaders)
|
||||
requestHeaders.push.apply(requestHeaders, this._options.requestHeaders);
|
||||
|
||||
for (var i = 0; i < requestHeaders.length; i += 2)
|
||||
this.transport.setRequestHeader(requestHeaders[i], requestHeaders[i+1]);
|
||||
},
|
||||
|
||||
onStateChange: function() {
|
||||
var readystate = this.transport.readyState;
|
||||
if (readystate != 1)
|
||||
this.respondToReadyState(this.transport.readyState);
|
||||
},
|
||||
|
||||
handleTimeout: function() {
|
||||
if(this.finished) { return; }
|
||||
this.finished = true;
|
||||
(this._options.onTimeout || Ajax.emptyFunction)(this);
|
||||
},
|
||||
|
||||
respondToReadyState: function(readystate) {
|
||||
var event = Ajax.Request.Events[readystate];
|
||||
|
||||
if (event == 'Complete') {
|
||||
try {
|
||||
if(!this.finished) {
|
||||
this.finished = true;
|
||||
if(this._options.timeout) { clearTimeout(this.transportTimer); }
|
||||
(this._options.onComplete || Ajax.emptyFunction)(this.transport);
|
||||
}
|
||||
} catch (e) {
|
||||
this.dispatchException(e);
|
||||
}
|
||||
|
||||
/* Avoid memory leak in MSIE: clean up the oncomplete event handler */
|
||||
this.transport.onreadystatechange = Ajax.emptyFunction;
|
||||
}
|
||||
},
|
||||
|
||||
dispatchException: function(exception) {
|
||||
(this._options.onException || Ajax.emptyFunction)(this, exception);
|
||||
}
|
||||
});
|
||||
|
||||
var EventHelper = {
|
||||
register : function(obj, ev,func){
|
||||
var oldev = obj[ev];
|
||||
|
||||
if (typeof oldev != 'function') {
|
||||
obj[ev] = func;
|
||||
} else {
|
||||
obj[ev] = function() {
|
||||
oldev();
|
||||
func();
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
/*
|
||||
Behaviour v1.1 by Ben Nolan, June 2005. Based largely on the work
|
||||
of Simon Willison (see comments by Simon below).
|
||||
http://ripcord.co.nz/behaviour/
|
||||
*/
|
||||
|
||||
var Behaviour = {
|
||||
list : new Array,
|
||||
|
||||
register : function(sheet){
|
||||
Behaviour.list.push(sheet);
|
||||
},
|
||||
|
||||
init : function(){
|
||||
EventHelper.register(window, 'onload', function(){
|
||||
Behaviour.apply();
|
||||
});
|
||||
},
|
||||
|
||||
apply : function(){
|
||||
for (h=0;sheet=Behaviour.list[h];h++){
|
||||
for (selector in sheet) {
|
||||
list = document.getElementsBySelector(selector);
|
||||
if (!list)
|
||||
continue;
|
||||
for( i = 0; element = list[i]; i++ ) {
|
||||
sheet[selector]( element );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
Behaviour.init();
|
||||
|
||||
function getAllChildren(e) {
|
||||
// Returns all children of element. Workaround required for IE5/Windows. Ugh.
|
||||
return e.all ? e.all : e.getElementsByTagName('*');
|
||||
}
|
||||
|
||||
document.getElementsBySelector = function(selector) {
|
||||
// Attempt to fail gracefully in lesser browsers
|
||||
if (!document.getElementsByTagName) {
|
||||
return new Array();
|
||||
}
|
||||
// Split selector in to tokens
|
||||
var tokens = selector.split(' ');
|
||||
var currentContext = new Array(document);
|
||||
for (var i = 0; i < tokens.length; i++) {
|
||||
token = tokens[i].replace(/^\s+/,'').replace(/\s+$/,'');;
|
||||
if (token.indexOf('#') > -1) {
|
||||
// Token is an ID selector
|
||||
var bits = token.split('#');
|
||||
var tag_name = bits[0];
|
||||
var id = bits[1];
|
||||
var element = document.getElementById(id);
|
||||
if (element == null || tag_name && element.nodeName.toLowerCase() != tag_name ) {
|
||||
// tag with that ID not found, return false
|
||||
return new Array();
|
||||
}
|
||||
// Set currentContext to contain just this element
|
||||
currentContext = new Array(element);
|
||||
continue; // Skip to next token
|
||||
}
|
||||
if (token.indexOf('.') > -1) {
|
||||
// Token contains a class selector
|
||||
var bits = token.split('.');
|
||||
var tag_name = bits[0];
|
||||
var class_name = bits[1];
|
||||
if (!tag_name) {
|
||||
tag_name = '*';
|
||||
}
|
||||
// Get elements matching tag, filter them for class selector
|
||||
var found = new Array;
|
||||
var foundCount = 0;
|
||||
for (var h = 0; h < currentContext.length; h++) {
|
||||
var elements;
|
||||
if (tag_name == '*') {
|
||||
elements = getAllChildren(currentContext[h]);
|
||||
} else {
|
||||
elements = currentContext[h].getElementsByTagName(tag_name);
|
||||
}
|
||||
if( elements == null )
|
||||
continue;
|
||||
for (var j = 0; j < elements.length; j++) {
|
||||
found[foundCount++] = elements[j];
|
||||
}
|
||||
}
|
||||
currentContext = new Array;
|
||||
var currentContextIndex = 0;
|
||||
for (var k = 0; k < found.length; k++) {
|
||||
if (found[k].className && found[k].className.match(new RegExp("\\b"+class_name+"\\b"))) {
|
||||
currentContext[currentContextIndex++] = found[k];
|
||||
}
|
||||
}
|
||||
continue; // Skip to next token
|
||||
}
|
||||
|
||||
// [evgeny] code for attribute selection is removed...
|
||||
|
||||
if (!currentContext[0]){
|
||||
return;
|
||||
}
|
||||
|
||||
// If we get here, token is JUST an element (not a class or ID selector)
|
||||
tag_name = token;
|
||||
var found = new Array;
|
||||
var foundCount = 0;
|
||||
for (var h = 0; h < currentContext.length; h++) {
|
||||
var elements = currentContext[h].getElementsByTagName(tag_name);
|
||||
for (var j = 0; j < elements.length; j++) {
|
||||
found[foundCount++] = elements[j];
|
||||
}
|
||||
}
|
||||
currentContext = found;
|
||||
}
|
||||
return currentContext;
|
||||
};
|
||||
|
||||
var NodeUtils = {
|
||||
|
||||
getNodeValue: function(parent,name) {
|
||||
var nodes = parent.getElementsByTagName( name );
|
||||
if( nodes.length == 0 )
|
||||
return "";
|
||||
nodes = nodes[0].childNodes;
|
||||
var reslt = "";
|
||||
for( i = 0; i < nodes.length; i++ )
|
||||
reslt += nodes[i].nodeValue;
|
||||
return reslt;
|
||||
},
|
||||
|
||||
getNodeText: function(_node) {
|
||||
var _nodes = _node.childNodes;
|
||||
var _text = "";
|
||||
for( i = 0; i < _nodes.length; i++ )
|
||||
_text += _nodes[i].nodeValue;
|
||||
return _text;
|
||||
},
|
||||
|
||||
getAttrValue: function(parent,name) {
|
||||
for( k=0; k < parent.attributes.length; k++ )
|
||||
if( parent.attributes[k].nodeName == name )
|
||||
return parent.attributes[k].nodeValue;
|
||||
return null;
|
||||
}
|
||||
};
|
||||
|
||||
var CommonUtils = {
|
||||
getRow: function(_id,_table) {
|
||||
var _row = _table.rows[_id];
|
||||
if( _row != null )
|
||||
return _row;
|
||||
if( _table.rows['head'] != null )
|
||||
return null;
|
||||
|
||||
for( k=0; k < _table.rows.length; k++ ) {
|
||||
if( _table.rows[k].id == _id )
|
||||
return _table.rows[k];
|
||||
}
|
||||
return null;
|
||||
},
|
||||
|
||||
getCell: function(_id,_row,_table) {
|
||||
var _cell = _row.cells[_id];
|
||||
if( _cell != null )
|
||||
return _cell;
|
||||
if( _table.rows['head'] != null )
|
||||
return null;
|
||||
for( k=0; k < _row.cells.length; k++ ) {
|
||||
if( _row.cells[k].id == _id )
|
||||
return _row.cells[k];
|
||||
}
|
||||
return null;
|
||||
},
|
||||
|
||||
insertCell: function(_row,_id,_className,_align,_height, _inner) {
|
||||
var cell = _row.insertCell(-1);
|
||||
cell.id = _id;
|
||||
if(_align)
|
||||
cell.align = _align;
|
||||
cell.className = _className;
|
||||
if(_height)
|
||||
cell.height = _height;
|
||||
cell.innerHTML = _inner;
|
||||
}
|
||||
};
|
||||
|
||||
function playSound(wav_file) {
|
||||
var player = document.createElement("div");
|
||||
var agt = navigator.userAgent.toLowerCase();
|
||||
if(agt.indexOf('opera') != -1) {
|
||||
player.style = "position: absolute; left: 0px; top: -200px;";
|
||||
}
|
||||
document.body.appendChild(player);
|
||||
player.innerHTML = '<audio autoplay src="'+wav_file+'"><embed src="'+wav_file+'" hidden="true" autostart="true" loop="false"></audio>';
|
||||
}
|
||||
|
||||
function htmlescape(str) {
|
||||
return str.replace('&','&').replace('<','<').replace('>','>').replace('"','"');
|
||||
}
|
@ -1,12 +0,0 @@
|
||||
Behaviour.register({
|
||||
'a#check-nv' : function(el) {
|
||||
el.onclick = function() {
|
||||
playSound(wroot + '/sounds/new_user.wav');
|
||||
};
|
||||
},
|
||||
'a#check-nm' : function(el) {
|
||||
el.onclick = function() {
|
||||
playSound(wroot + '/sounds/new_message.wav')
|
||||
};
|
||||
}
|
||||
});
|
@ -1,384 +0,0 @@
|
||||
/**
|
||||
* @preserve This file is part of Mibew Messenger project.
|
||||
* http://mibew.org
|
||||
*
|
||||
* Copyright (c) 2005-2013 Mibew Messenger Community
|
||||
* License: http://mibew.org/license.php
|
||||
*/
|
||||
|
||||
Ajax.PeriodicalUpdater = Class.create();
|
||||
Class.inherit( Ajax.PeriodicalUpdater, 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.frequency = (this._options.frequency || 2);
|
||||
this.updater = {};
|
||||
this.update();
|
||||
},
|
||||
|
||||
handleException: function(_request, ex) {
|
||||
if( this._options.handleError )
|
||||
this._options.handleError("offline, reconnecting");
|
||||
this.stopUpdate();
|
||||
this.timer = setTimeout(this.update.bind(this), 1000);
|
||||
},
|
||||
|
||||
handleTimeout: function(_request) {
|
||||
if( this._options.handleError )
|
||||
this._options.handleError("timeout, reconnecting");
|
||||
this.stopUpdate();
|
||||
this.timer = setTimeout(this.update.bind(this), 1000);
|
||||
},
|
||||
|
||||
stopUpdate: function() {
|
||||
if( this.updater._options )
|
||||
this.updater._options.onComplete = undefined;
|
||||
clearTimeout(this.timer);
|
||||
},
|
||||
|
||||
update: function() {
|
||||
if( this._options.updateParams )
|
||||
this._options.parameters = (this._options.updateParams)();
|
||||
this.updater = new Ajax.Request(this._options.url, this._options);
|
||||
},
|
||||
|
||||
requestComplete: function(presponse) {
|
||||
try {
|
||||
var xmlRoot = Ajax.getXml(presponse);
|
||||
if( xmlRoot ) {
|
||||
(this._options.updateContent || Ajax.emptyFunction)( xmlRoot );
|
||||
} else {
|
||||
if( this._options.handleError )
|
||||
this._options.handleError("reconnecting");
|
||||
}
|
||||
} catch(e) {
|
||||
}
|
||||
this.timer = setTimeout(this.update.bind(this), this.frequency * 1000);
|
||||
}
|
||||
});
|
||||
|
||||
var HtmlGenerationUtils = {
|
||||
|
||||
popupLink: function(link, title, wndid, inner, width, height,linkclass) {
|
||||
return '<a href="'+link+'"'+(linkclass != null ? ' class="'+linkclass+'"' : '')+' target="_blank" title="'+title+'" onclick="this.newWindow = window.open(\''+link+'\', \''+
|
||||
wndid+'\', \'toolbar=0,scrollbars=0,location=0,status=1,menubar=0,width='+width+',height='+height+',resizable=1\');this.newWindow.focus();this.newWindow.opener=window;return false;">'+
|
||||
inner+'</a>';
|
||||
},
|
||||
|
||||
generateOneRowTable: function(content) {
|
||||
return '<table class="inner"><tr>' + content + '</tr></table>';
|
||||
},
|
||||
|
||||
viewOpenCell: function(username,servlet,id,canview,canopen,ban,message,cantakenow) {
|
||||
var cellsCount = 2;
|
||||
var link = servlet+"?thread="+id;
|
||||
var gen = '<td>';
|
||||
if(canopen || canview ) {
|
||||
gen += HtmlGenerationUtils.popupLink( (cantakenow||!canview) ? link : link+"&viewonly=true", localized[canopen ? 0 : 1], "ImCenter"+id, username, 640, 480, null);
|
||||
} else {
|
||||
gen += '<a href="#">' + username + '</a>';
|
||||
}
|
||||
gen += '</td>';
|
||||
if( canopen ) {
|
||||
gen += '<td class="icon">';
|
||||
gen += HtmlGenerationUtils.popupLink( link, localized[0], "ImCenter"+id, '<img src="'+webimRoot+'/images/tbliclspeak.gif" width="15" height="15" border="0" alt="'+localized[0]+'">', 640, 480, null);
|
||||
gen += '</td>';
|
||||
cellsCount++;
|
||||
}
|
||||
if( canview ) {
|
||||
gen += '<td class="icon">';
|
||||
gen += HtmlGenerationUtils.popupLink( link+"&viewonly=true", localized[1], "ImCenter"+id, '<img src="'+webimRoot+'/images/tbliclread.gif" width="15" height="15" border="0" alt="'+localized[1]+'">', 640, 480, null);
|
||||
gen += '</td>';
|
||||
cellsCount++;
|
||||
}
|
||||
if( message != "" ) {
|
||||
gen += '</tr><tr><td class="firstmessage" colspan="'+cellsCount+'"><a href="javascript:void(0)" title="'+message+'" onclick="alert(this.title);return false;">';
|
||||
gen += message.length > 30 ? message.substring(0,30) + '...' : message;
|
||||
gen += '</a></td>';
|
||||
}
|
||||
return HtmlGenerationUtils.generateOneRowTable(gen);
|
||||
},
|
||||
banCell: function(id,banid){
|
||||
return '<td class="icon">'+
|
||||
HtmlGenerationUtils.popupLink( webimRoot+'/operator/ban.php?'+(banid ? 'id='+banid : 'thread='+id), localized[2], "ban"+id, '<img src="'+webimRoot+'/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(_options) {
|
||||
this.setOptions(_options);
|
||||
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 = new Object();
|
||||
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(msg) {
|
||||
this._options.status.innerHTML = msg;
|
||||
},
|
||||
|
||||
handleError: function(s) {
|
||||
this.setStatus( s );
|
||||
},
|
||||
|
||||
updateThread: function(node) {
|
||||
var id, stateid, vstate, canview = false, canopen = false, canban = false, ban = null, banid = null;
|
||||
|
||||
for( var i = 0; i < node.attributes.length; i++ ) {
|
||||
var attr = node.attributes[i];
|
||||
if( attr.nodeName == "id" )
|
||||
id = attr.nodeValue;
|
||||
else if( attr.nodeName == "stateid" )
|
||||
stateid = attr.nodeValue;
|
||||
else if( attr.nodeName == "state" )
|
||||
vstate = attr.nodeValue;
|
||||
else if( attr.nodeName == "canopen" )
|
||||
canopen = true;
|
||||
else if( attr.nodeName == "canview" )
|
||||
canview = true;
|
||||
else if( attr.nodeName == "canban" )
|
||||
canban = true;
|
||||
else if( attr.nodeName == "ban" )
|
||||
ban = attr.nodeValue;
|
||||
else if( attr.nodeName == "banid" )
|
||||
banid = attr.nodeValue;
|
||||
}
|
||||
|
||||
function setcell(_table, row,id,pcontent) {
|
||||
var cell = CommonUtils.getCell( id, row, _table );
|
||||
if( cell )
|
||||
cell.innerHTML = pcontent;
|
||||
}
|
||||
|
||||
var row = CommonUtils.getRow("thr"+id, this.t);
|
||||
if( stateid == "closed" ) {
|
||||
if( row ) {
|
||||
this.t.deleteRow(row.rowIndex);
|
||||
}
|
||||
this.threadTimers[id] = null;
|
||||
return;
|
||||
}
|
||||
|
||||
var vname = NodeUtils.getNodeValue(node,"name");
|
||||
var vaddr = NodeUtils.getNodeValue(node,"addr");
|
||||
var vtime = NodeUtils.getNodeValue(node,"time");
|
||||
var agent = NodeUtils.getNodeValue(node,"agent");
|
||||
var modified = NodeUtils.getNodeValue(node,"modified");
|
||||
var message = NodeUtils.getNodeValue(node,"message");
|
||||
var etc = '<td>'+NodeUtils.getNodeValue(node,"useragent")+'</td>';
|
||||
|
||||
if(ban != null) {
|
||||
etc = '<td>'+NodeUtils.getNodeValue(node,"reason")+'</td>';
|
||||
}
|
||||
|
||||
if(canban) {
|
||||
etc += HtmlGenerationUtils.banCell(id,banid);
|
||||
}
|
||||
etc = HtmlGenerationUtils.generateOneRowTable(etc);
|
||||
|
||||
var startRow = CommonUtils.getRow("t"+stateid, this.t);
|
||||
var endRow = CommonUtils.getRow("t"+stateid+"end", this.t);
|
||||
|
||||
if( row != null && (row.rowIndex <= startRow.rowIndex || row.rowIndex >= endRow.rowIndex ) ) {
|
||||
this.t.deleteRow(row.rowIndex);
|
||||
this.threadTimers[id] = null;
|
||||
row = null;
|
||||
}
|
||||
if( row == null ) {
|
||||
row = this.t.insertRow(startRow.rowIndex+1);
|
||||
row.className = (ban == "blocked" && stateid != "chat") ? "ban" : "in"+stateid;
|
||||
row.id = "thr"+id;
|
||||
this.threadTimers[id] = new Array(vtime,modified,stateid);
|
||||
CommonUtils.insertCell(row, "name", "visitor", null, null, HtmlGenerationUtils.viewOpenCell(vname,this._options.agentservl,id,canview,canopen,ban,message,stateid!='chat'));
|
||||
CommonUtils.insertCell(row, "contid", "visitor", "center", null, vaddr );
|
||||
CommonUtils.insertCell(row, "state", "visitor", "center", null, vstate );
|
||||
CommonUtils.insertCell(row, "op", "visitor", "center", null, agent );
|
||||
CommonUtils.insertCell(row, "time", "visitor", "center", null, this.getTimeSince(vtime) );
|
||||
CommonUtils.insertCell(row, "wait", "visitor", "center", null, (stateid!='chat' ? this.getTimeSince(modified) : '-') );
|
||||
CommonUtils.insertCell(row, "etc", "visitor", "center", null, etc );
|
||||
|
||||
if( stateid == 'wait' || stateid == 'prio' )
|
||||
return true;
|
||||
} else {
|
||||
this.threadTimers[id] = new Array(vtime,modified,stateid);
|
||||
row.className = (ban == "blocked" && stateid != "chat") ? "ban" : "in"+stateid;
|
||||
setcell(this.t, row,"name",HtmlGenerationUtils.viewOpenCell(vname,this._options.agentservl,id,canview,canopen,ban,message,stateid!='chat'));
|
||||
setcell(this.t, row,"contid",vaddr);
|
||||
setcell(this.t, row,"state",vstate);
|
||||
setcell(this.t, row,"op",agent);
|
||||
setcell(this.t, row,"time",this.getTimeSince(vtime));
|
||||
setcell(this.t, row,"wait",(stateid!='chat' ? this.getTimeSince(modified) : '-'));
|
||||
setcell(this.t, row,"etc",etc);
|
||||
}
|
||||
return false;
|
||||
},
|
||||
|
||||
updateQueueMessages: function() {
|
||||
function queueNotEmpty(t,id) {
|
||||
var startRow = $(id);
|
||||
var endRow = $(id+"end");
|
||||
if( startRow == null || endRow == null ) {
|
||||
return false;
|
||||
}
|
||||
return startRow.rowIndex+1 < endRow.rowIndex;
|
||||
}
|
||||
var _status = $("statustd");
|
||||
if( _status) {
|
||||
var notempty = queueNotEmpty(this.t, "twait") || queueNotEmpty(this.t, "tprio") || queueNotEmpty(this.t, "tchat");
|
||||
_status.innerHTML = notempty ? "" : this._options.noclients;
|
||||
_status.height = notempty ? 5 : 30;
|
||||
}
|
||||
},
|
||||
|
||||
getTimeSince: function(srvtime) {
|
||||
var secs = Math.floor(((new Date()).getTime()-srvtime-this.delta)/1000);
|
||||
var minutes = Math.floor(secs/60);
|
||||
var prefix = "";
|
||||
secs = secs % 60;
|
||||
if( secs < 10 )
|
||||
secs = "0" + secs;
|
||||
if( minutes >= 60 ) {
|
||||
var hours = Math.floor(minutes/60);
|
||||
minutes = minutes % 60;
|
||||
if( minutes < 10 )
|
||||
minutes = "0" + minutes;
|
||||
prefix = hours + ":";
|
||||
}
|
||||
|
||||
return prefix + minutes+":"+secs;
|
||||
},
|
||||
|
||||
updateTimers: function() {
|
||||
for (var i in this.threadTimers) {
|
||||
if (this.threadTimers[i] != null) {
|
||||
var value = this.threadTimers[i];
|
||||
var row = CommonUtils.getRow("thr"+i, this.t);
|
||||
if( row != null ) {
|
||||
function setcell(_table, row,id,pcontent) {
|
||||
var cell = CommonUtils.getCell( id, row, _table );
|
||||
if( cell )
|
||||
cell.innerHTML = pcontent;
|
||||
}
|
||||
setcell(this.t, row,"time",this.getTimeSince(value[0]));
|
||||
setcell(this.t, row,"wait",(value[2]!='chat' ? this.getTimeSince(value[1]) : '-'));
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
updateThreads: function(root) {
|
||||
var newAdded = false;
|
||||
var _time = NodeUtils.getAttrValue(root, "time");
|
||||
var _revision = NodeUtils.getAttrValue(root, "revision" );
|
||||
|
||||
if( _time )
|
||||
this.delta = (new Date()).getTime() - _time;
|
||||
if( _revision )
|
||||
this._options.lastrevision = _revision;
|
||||
|
||||
for( var i = 0; i < root.childNodes.length; i++ ) {
|
||||
var node = root.childNodes[i];
|
||||
if( node.tagName == 'thread' )
|
||||
if( this.updateThread(node) )
|
||||
newAdded = true;
|
||||
}
|
||||
this.updateQueueMessages();
|
||||
this.updateTimers();
|
||||
this.setStatus(this._options.istatus ? "Away" : "Up to date");
|
||||
if( newAdded ) {
|
||||
playSound(webimRoot+'/sounds/new_user.wav');
|
||||
window.focus();
|
||||
if(updaterOptions.showpopup) {
|
||||
alert(localized[5]);
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
updateOperators: function(root) {
|
||||
var div = $('onlineoperators');
|
||||
if (!div)
|
||||
return;
|
||||
|
||||
var names = [];
|
||||
|
||||
for( var i = 0; i < root.childNodes.length; i++ ) {
|
||||
var node = root.childNodes[i];
|
||||
if(node.tagName != 'operator')
|
||||
continue;
|
||||
|
||||
var name = NodeUtils.getAttrValue(node, 'name');
|
||||
var isAway = NodeUtils.getAttrValue(node, 'away') != null;
|
||||
|
||||
names[names.length] =
|
||||
'<img src="'+webimRoot+'/images/op'+(isAway ? 'away' : 'online')+
|
||||
'.gif" width="12" height="12" border="0" alt="'+localized[1]+'"> '+ name;
|
||||
}
|
||||
|
||||
div.innerHTML = names.join(', ');
|
||||
},
|
||||
|
||||
updateContent: function(root) {
|
||||
if( root.tagName == 'update' ) {
|
||||
for( var i = 0; i < root.childNodes.length; i++ ) {
|
||||
var node = root.childNodes[i];
|
||||
|
||||
if (node.tagName == 'threads') {
|
||||
this.updateThreads(node);
|
||||
} else if (node.tagName == 'operators') {
|
||||
this.updateOperators(node);
|
||||
}
|
||||
}
|
||||
} else if( root.tagName == 'error' ) {
|
||||
this.setStatus(NodeUtils.getNodeValue(root,"descr") );
|
||||
} else {
|
||||
this.setStatus( "reconnecting" );
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
function togglemenu() {
|
||||
if($("sidebar") && $("wcontent") && $("togglemenu")) {
|
||||
if($("wcontent").className == "contentnomenu") {
|
||||
$("sidebar").style.display = "block";
|
||||
$("wcontent").className = "contentinner";
|
||||
$("togglemenu").innerHTML = localized[4];
|
||||
} else {
|
||||
$("sidebar").style.display = "none";
|
||||
$("wcontent").className = "contentnomenu";
|
||||
$("togglemenu").innerHTML = localized[3];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
var webimRoot = "";
|
||||
|
||||
Behaviour.register({
|
||||
'#togglemenu' : function(el) {
|
||||
el.onclick = function() {
|
||||
togglemenu();
|
||||
};
|
||||
}
|
||||
});
|
||||
|
||||
EventHelper.register(window, 'onload', function(){
|
||||
webimRoot = updaterOptions.wroot;
|
||||
new Ajax.ThreadListUpdater(({table:$("threadlist"),status:$("connstatus"),istatus:0}).extend(updaterOptions || {}));
|
||||
if(!updaterOptions.havemenu) {
|
||||
togglemenu();
|
||||
}
|
||||
});
|
@ -1,122 +0,0 @@
|
||||
<?php
|
||||
/*
|
||||
* Copyright 2005-2013 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
require_once('libs/common.php');
|
||||
require_once('libs/chat.php');
|
||||
require_once('libs/expand.php');
|
||||
require_once('libs/groups.php');
|
||||
require_once('libs/captcha.php');
|
||||
require_once('libs/notify.php');
|
||||
|
||||
$errors = array();
|
||||
$page = array();
|
||||
|
||||
function store_message($name, $email, $info, $message,$groupid,$referrer) {
|
||||
global $state_left, $current_locale, $kind_for_agent, $kind_user;
|
||||
$remoteHost = get_remote_host();
|
||||
$userbrowser = $_SERVER['HTTP_USER_AGENT'];
|
||||
$visitor = visitor_from_request();
|
||||
$link = connect();
|
||||
$thread = create_thread($groupid,$name,$remoteHost,$referrer,$current_locale,$visitor['id'], $userbrowser,$state_left,$link);
|
||||
if( $referrer ) {
|
||||
post_message_($thread['threadid'],$kind_for_agent,getstring2('chat.came.from',array($referrer)),$link);
|
||||
}
|
||||
if($email) {
|
||||
post_message_($thread['threadid'],$kind_for_agent,getstring2('chat.visitor.email',array($email)),$link);
|
||||
}
|
||||
if($info) {
|
||||
post_message_($thread['threadid'],$kind_for_agent,getstring2('chat.visitor.info',array($info)),$link);
|
||||
}
|
||||
post_message_($thread['threadid'],$kind_user,$message,$link,$name);
|
||||
mysql_close($link);
|
||||
}
|
||||
|
||||
$groupid = "";
|
||||
$groupname = "";
|
||||
$group = NULL;
|
||||
loadsettings();
|
||||
if($settings['enablegroups'] == '1') {
|
||||
$groupid = verifyparam( "group", "/^\d{1,8}$/", "");
|
||||
if($groupid) {
|
||||
$group = group_by_id($groupid);
|
||||
if(!$group) {
|
||||
$groupid = "";
|
||||
} else {
|
||||
$groupname = get_group_name($group);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$email = getparam('email');
|
||||
$visitor_name = getparam('name');
|
||||
$message = getparam('message');
|
||||
$info = getparam('info');
|
||||
$referrer = urldecode(getparam("referrer"));
|
||||
|
||||
if( !$email ) {
|
||||
$errors[] = no_field("form.field.email");
|
||||
} else if( !$visitor_name ) {
|
||||
$errors[] = no_field("form.field.name");
|
||||
} else if( !$message ) {
|
||||
$errors[] = no_field("form.field.message");
|
||||
} else {
|
||||
if( !is_valid_email($email)) {
|
||||
$errors[] = wrong_field("form.field.email");
|
||||
}
|
||||
}
|
||||
|
||||
if($settings["enablecaptcha"] == "1" && can_show_captcha()) {
|
||||
$captcha = getparam('captcha');
|
||||
$original = isset($_SESSION["mibew_captcha"]) ? $_SESSION["mibew_captcha"] : "";
|
||||
if(empty($original) || empty($captcha) || $captcha != $original) {
|
||||
$errors[] = getlocal('errors.captcha');
|
||||
}
|
||||
unset($_SESSION['mibew_captcha']);
|
||||
}
|
||||
|
||||
if( count($errors) > 0 ) {
|
||||
setup_leavemessage($visitor_name,$email,$message,$groupid,$groupname,$info,$referrer,can_show_captcha());
|
||||
setup_logo();
|
||||
expand("styles", getchatstyle(), "leavemessage.tpl");
|
||||
exit;
|
||||
}
|
||||
|
||||
$message_locale = $settings['left_messages_locale'];
|
||||
if(!locale_exists($message_locale)) {
|
||||
$message_locale = $home_locale;
|
||||
}
|
||||
|
||||
store_message($visitor_name, $email, $info, $message, $groupid, $referrer);
|
||||
|
||||
$subject = getstring2_("leavemail.subject", array($visitor_name), $message_locale);
|
||||
$body = getstring2_("leavemail.body", array($visitor_name,$email,$message,$info ? "$info\n" : ""), $message_locale);
|
||||
|
||||
if (isset($group) && !empty($group['vcemail'])) {
|
||||
$inbox_mail = $group['vcemail'];
|
||||
} else {
|
||||
$inbox_mail = $settings['email'];
|
||||
}
|
||||
|
||||
if($inbox_mail) {
|
||||
$link = connect();
|
||||
webim_mail($inbox_mail, $email, $subject, $body, $link);
|
||||
mysql_close($link);
|
||||
}
|
||||
|
||||
setup_logo();
|
||||
expand("styles", getchatstyle(), "leavemessagesent.tpl");
|
||||
?>
|
@ -1,71 +0,0 @@
|
||||
<?php
|
||||
/*
|
||||
* Copyright 2005-2013 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
function can_show_captcha()
|
||||
{
|
||||
return extension_loaded("gd");
|
||||
}
|
||||
|
||||
function gen_captcha()
|
||||
{
|
||||
$md5_hash = md5(rand(0, 9999));
|
||||
return substr($md5_hash, 15, 5);
|
||||
}
|
||||
|
||||
function draw_captcha($security_code)
|
||||
{
|
||||
|
||||
//Set the image width and height
|
||||
$width = 100;
|
||||
$height = 25;
|
||||
|
||||
//Create the image resource
|
||||
$image = ImageCreate($width, $height);
|
||||
if (function_exists('imageantialias')) {
|
||||
imageantialias($image, true);
|
||||
}
|
||||
|
||||
//We are making three colors, white, black and gray
|
||||
$white = ImageColorAllocate($image, 255, 255, 255);
|
||||
$black = ImageColorAllocate($image, 15, 50, 15);
|
||||
$grey = ImageColorAllocate($image, 204, 204, 204);
|
||||
$ellipsec = ImageColorAllocate($image, 0, 100, 60);
|
||||
|
||||
//Make the background black
|
||||
ImageFill($image, 0, 0, $black);
|
||||
imagefilledellipse($image, 56, 15, 30, 17, $ellipsec);
|
||||
|
||||
//Add randomly generated string in white to the image
|
||||
ImageString($image, 5, 30, 4, $security_code, $white);
|
||||
|
||||
//Throw in some lines to make it a little bit harder for any bots to break
|
||||
ImageRectangle($image, 0, 0, $width - 1, $height - 1, $grey);
|
||||
imageline($image, 0, $height / 2 + 3, $width, $height / 2 + 5, $grey);
|
||||
imageline($image, $width / 2 - 14, 0, $width / 2 + 7, $height, $grey);
|
||||
|
||||
|
||||
//Tell the browser what kind of file is come in
|
||||
header("Content-Type: image/jpeg");
|
||||
|
||||
//Output the newly created image in jpeg format
|
||||
ImageJpeg($image);
|
||||
|
||||
//Free up resources
|
||||
ImageDestroy($image);
|
||||
}
|
||||
|
||||
?>
|
@ -1,783 +0,0 @@
|
||||
<?php
|
||||
/*
|
||||
* Copyright 2005-2013 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
$connection_timeout = 30; // sec
|
||||
|
||||
$namecookie = "WEBIM_Data";
|
||||
$usercookie = "WEBIM_UserID";
|
||||
|
||||
$state_queue = 0;
|
||||
$state_waiting = 1;
|
||||
$state_chatting = 2;
|
||||
$state_closed = 3;
|
||||
$state_loading = 4;
|
||||
$state_left = 5;
|
||||
|
||||
$kind_user = 1;
|
||||
$kind_agent = 2;
|
||||
$kind_for_agent = 3;
|
||||
$kind_info = 4;
|
||||
$kind_conn = 5;
|
||||
$kind_events = 6;
|
||||
$kind_avatar = 7;
|
||||
|
||||
$kind_to_string = array($kind_user => "user", $kind_agent => "agent", $kind_for_agent => "hidden",
|
||||
$kind_info => "inf", $kind_conn => "conn", $kind_events => "event", $kind_avatar => "avatar");
|
||||
|
||||
function get_user_id()
|
||||
{
|
||||
return (time() + microtime()) . rand(0, 99999999);
|
||||
}
|
||||
|
||||
function next_token()
|
||||
{
|
||||
return rand(99999, 99999999);
|
||||
}
|
||||
|
||||
function next_revision($link)
|
||||
{
|
||||
global $mysqlprefix;
|
||||
perform_query("update ${mysqlprefix}chatrevision set id=LAST_INSERT_ID(id+1)", $link);
|
||||
$val = mysql_insert_id($link);
|
||||
return $val;
|
||||
}
|
||||
|
||||
function post_message_($threadid, $kind, $message, $link, $from = null, $utime = null, $opid = null)
|
||||
{
|
||||
global $mysqlprefix;
|
||||
$query = sprintf(
|
||||
"insert into ${mysqlprefix}chatmessage (threadid,ikind,tmessage,tname,agentId,dtmcreated) values (%s, %s,'%s',%s,%s,%s)",
|
||||
$threadid,
|
||||
$kind,
|
||||
mysql_real_escape_string($message, $link),
|
||||
$from ? "'" . mysql_real_escape_string($from, $link) . "'" : "null",
|
||||
$opid ? $opid : "0",
|
||||
$utime ? "FROM_UNIXTIME($utime)" : "CURRENT_TIMESTAMP");
|
||||
|
||||
perform_query($query, $link);
|
||||
return mysql_insert_id($link);
|
||||
}
|
||||
|
||||
function post_message($threadid, $kind, $message, $from = null, $agentid = null)
|
||||
{
|
||||
$link = connect();
|
||||
$id = post_message_($threadid, $kind, $message, $link, $from, null, $agentid);
|
||||
mysql_close($link);
|
||||
return $id;
|
||||
}
|
||||
|
||||
function prepare_html_message($text)
|
||||
{
|
||||
$escaped_text = htmlspecialchars($text);
|
||||
$text_w_links = preg_replace('/(http|ftp):\/\/\S*/', '<a href="$0" target="_blank">$0</a>', $escaped_text);
|
||||
$multiline = str_replace("\n", "<br/>", $text_w_links);
|
||||
return $multiline;
|
||||
}
|
||||
|
||||
function message_to_html($msg)
|
||||
{
|
||||
global $kind_to_string, $kind_avatar;
|
||||
if ($msg['ikind'] == $kind_avatar) return "";
|
||||
$message = "<span>" . date("H:i:s", $msg['created']) . "</span> ";
|
||||
$kind = $kind_to_string{$msg['ikind']};
|
||||
if ($msg['tname'])
|
||||
$message .= "<span class='n$kind'>" . htmlspecialchars($msg['tname']) . "</span>: ";
|
||||
$message .= "<span class='m$kind'>" . prepare_html_message($msg['tmessage']) . "</span><br/>";
|
||||
return $message;
|
||||
}
|
||||
|
||||
function message_to_text($msg)
|
||||
{
|
||||
global $kind_user, $kind_agent, $kind_info, $kind_avatar;
|
||||
if ($msg['ikind'] == $kind_avatar) return "";
|
||||
$message_time = date("H:i:s ", $msg['created']);
|
||||
if ($msg['ikind'] == $kind_user || $msg['ikind'] == $kind_agent) {
|
||||
if ($msg['tname'])
|
||||
return $message_time . $msg['tname'] . ": " . $msg['tmessage'] . "\n";
|
||||
else
|
||||
return $message_time . $msg['tmessage'] . "\n";
|
||||
} else if ($msg['ikind'] == $kind_info) {
|
||||
return $message_time . $msg['tmessage'] . "\n";
|
||||
} else {
|
||||
return $message_time . "[" . $msg['tmessage'] . "]\n";
|
||||
}
|
||||
}
|
||||
|
||||
function get_messages($threadid, $meth, $isuser, &$lastid)
|
||||
{
|
||||
global $kind_for_agent, $kind_avatar, $webim_encoding, $mysqlprefix;
|
||||
$link = connect();
|
||||
|
||||
$query = sprintf(
|
||||
"select messageid,ikind,unix_timestamp(dtmcreated) as created,tname,tmessage from ${mysqlprefix}chatmessage " .
|
||||
"where threadid = %s and messageid > %s %s order by messageid",
|
||||
$threadid, $lastid, $isuser ? "and ikind <> $kind_for_agent" : "");
|
||||
|
||||
$messages = array();
|
||||
$msgs = select_multi_assoc($query, $link);
|
||||
foreach ($msgs as $msg) {
|
||||
$message = "";
|
||||
if ($meth == 'xml') {
|
||||
switch ($msg['ikind']) {
|
||||
case $kind_avatar:
|
||||
$message = "<avatar>" . myiconv($webim_encoding, "utf-8", escape_with_cdata($msg['tmessage'])) . "</avatar>";
|
||||
break;
|
||||
default:
|
||||
$message = "<message>" . myiconv($webim_encoding, "utf-8", escape_with_cdata(message_to_html($msg))) . "</message>\n";
|
||||
}
|
||||
} else {
|
||||
if ($msg['ikind'] != $kind_avatar) {
|
||||
$message = (($meth == 'text') ? message_to_text($msg) : topage(message_to_html($msg)));
|
||||
}
|
||||
}
|
||||
|
||||
$messages[] = $message;
|
||||
if ($msg['messageid'] > $lastid) {
|
||||
$lastid = $msg['messageid'];
|
||||
}
|
||||
}
|
||||
|
||||
mysql_close($link);
|
||||
return $messages;
|
||||
}
|
||||
|
||||
function print_thread_messages($thread, $token, $lastid, $isuser, $format, $agentid = null)
|
||||
{
|
||||
global $webim_encoding, $webimroot, $connection_timeout, $settings;
|
||||
$threadid = $thread['threadid'];
|
||||
$istyping = abs($thread['current'] - $thread[$isuser ? "lpagent" : "lpuser"]) < $connection_timeout
|
||||
&& $thread[$isuser ? "agentTyping" : "userTyping"] == "1" ? "1" : "0";
|
||||
|
||||
if ($format == "xml") {
|
||||
$output = get_messages($threadid, "xml", $isuser, $lastid);
|
||||
|
||||
start_xml_output();
|
||||
print("<thread lastid=\"$lastid\" typing=\"" . $istyping . "\" canpost=\"" . (($isuser || $agentid != null && $agentid == $thread['agentId']) ? 1 : 0) . "\">");
|
||||
foreach ($output as $msg) {
|
||||
print $msg;
|
||||
}
|
||||
print("</thread>");
|
||||
} else if ($format == "html") {
|
||||
loadsettings();
|
||||
$output = get_messages($threadid, "html", $isuser, $lastid);
|
||||
|
||||
start_html_output();
|
||||
$url = "$webimroot/thread.php?act=refresh&thread=$threadid&token=$token&html=on&user=" . ($isuser ? "true" : "false");
|
||||
|
||||
print(
|
||||
"<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">" .
|
||||
"<html>\n<head>\n" .
|
||||
"<link href=\"$webimroot/styles/default/chat.css\" rel=\"stylesheet\" type=\"text/css\">\n" .
|
||||
"<meta http-equiv=\"Refresh\" content=\"" . $settings['updatefrequency_oldchat'] . "; URL=$url&sn=11\">\n" .
|
||||
"<meta http-equiv=\"Pragma\" content=\"no-cache\">\n" .
|
||||
"<title>chat</title>\n" .
|
||||
"</head>\n" .
|
||||
"<body bgcolor='#FFFFFF' text='#000000' link='#C28400' vlink='#C28400' alink='#C28400' onload=\"if( location.hash != '#aend' ){location.hash='#aend';}\">" .
|
||||
"<table width='100%' cellspacing='0' cellpadding='0' border='0'><tr><td valign='top' class='message'>");
|
||||
|
||||
foreach ($output as $msg) {
|
||||
print $msg;
|
||||
}
|
||||
|
||||
print(
|
||||
"</td></tr></table><a name='aend'></a>" .
|
||||
"</body></html>");
|
||||
}
|
||||
}
|
||||
|
||||
function get_user_name($username, $addr, $id)
|
||||
{
|
||||
global $settings;
|
||||
loadsettings();
|
||||
return str_replace("{addr}", $addr,
|
||||
str_replace("{id}", $id,
|
||||
str_replace("{name}", $username, $settings['usernamepattern'])));
|
||||
}
|
||||
|
||||
function is_ajax_browser($browserid, $ver, $useragent)
|
||||
{
|
||||
if ($browserid == "opera")
|
||||
return $ver >= 8.02;
|
||||
if ($browserid == "safari")
|
||||
return $ver >= 125;
|
||||
if ($browserid == "msie")
|
||||
return $ver >= 5.5 && !strstr($useragent, "powerpc");
|
||||
if ($browserid == "netscape")
|
||||
return $ver >= 7.1;
|
||||
if ($browserid == "mozilla")
|
||||
return $ver >= 1.4;
|
||||
if ($browserid == "firefox")
|
||||
return $ver >= 1.0;
|
||||
if ($browserid == "chrome")
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
function is_old_browser($browserid, $ver)
|
||||
{
|
||||
if ($browserid == "opera")
|
||||
return $ver < 7.0;
|
||||
if ($browserid == "msie")
|
||||
return $ver < 5.0;
|
||||
return false;
|
||||
}
|
||||
|
||||
$knownAgents = array("opera", "msie", "chrome", "safari", "firefox", "netscape", "mozilla");
|
||||
|
||||
function get_remote_level($useragent)
|
||||
{
|
||||
global $knownAgents;
|
||||
$useragent = strtolower($useragent);
|
||||
foreach ($knownAgents as $agent) {
|
||||
if (strstr($useragent, $agent)) {
|
||||
if (preg_match("/" . $agent . "[\\s\/]?(\\d+(\\.\\d+)?)/", $useragent, $matches)) {
|
||||
$ver = $matches[1];
|
||||
|
||||
if (is_ajax_browser($agent, $ver, $useragent))
|
||||
return "ajaxed";
|
||||
else if (is_old_browser($agent, $ver))
|
||||
return "old";
|
||||
|
||||
return "simple";
|
||||
}
|
||||
}
|
||||
}
|
||||
return "simple";
|
||||
}
|
||||
|
||||
function is_agent_opera95()
|
||||
{
|
||||
$useragent = strtolower($_SERVER['HTTP_USER_AGENT']);
|
||||
if (strstr($useragent, "opera")) {
|
||||
if (preg_match("/opera[\\s\/]?(\\d+(\\.\\d+)?)/", $useragent, $matches)) {
|
||||
$ver = $matches[1];
|
||||
|
||||
if ($ver >= "9.5")
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
function is_mac_opera()
|
||||
{
|
||||
$useragent = strtolower($_SERVER['HTTP_USER_AGENT']);
|
||||
return strstr($useragent, "opera") && strstr($useragent, "mac");
|
||||
}
|
||||
|
||||
function needsFramesrc()
|
||||
{
|
||||
$useragent = strtolower($_SERVER['HTTP_USER_AGENT']);
|
||||
return strstr($useragent, "safari/");
|
||||
}
|
||||
|
||||
function setup_logo()
|
||||
{
|
||||
global $page, $settings;
|
||||
loadsettings();
|
||||
$page['ct.company.name'] = topage($settings['title']);
|
||||
$page['ct.company.chatLogoURL'] = topage($settings['logo']);
|
||||
$page['webimHost'] = topage($settings['hosturl']);
|
||||
}
|
||||
|
||||
function setup_leavemessage($name, $email, $message, $groupid, $groupname, $info, $referrer, $canshowcaptcha)
|
||||
{
|
||||
global $settings, $page;
|
||||
$page['formname'] = topage($name);
|
||||
$page['formemail'] = topage($email);
|
||||
$page['formmessage'] = $message ? topage($message) : "";
|
||||
$page['showcaptcha'] = $settings["enablecaptcha"] == "1" && $canshowcaptcha ? "1" : "";
|
||||
$page['formgroupid'] = $groupid;
|
||||
$page['formgroupname'] = $groupname;
|
||||
$page['forminfo'] = topage($info);
|
||||
$page['referrer'] = urlencode(topage($referrer));
|
||||
}
|
||||
|
||||
function setup_survey($name, $email, $groupid, $info, $referrer)
|
||||
{
|
||||
global $settings, $page;
|
||||
|
||||
$page['formname'] = topage($name);
|
||||
$page['formemail'] = topage($email);
|
||||
$page['formgroupid'] = $groupid;
|
||||
$page['forminfo'] = topage($info);
|
||||
$page['referrer'] = urlencode(topage($referrer));
|
||||
|
||||
if ($settings['enablegroups'] == '1' && $settings["surveyaskgroup"] == "1") {
|
||||
$link = connect();
|
||||
$allgroups = get_groups($link, false);
|
||||
mysql_close($link);
|
||||
$val = "";
|
||||
foreach ($allgroups as $k) {
|
||||
$groupname = $k['vclocalname'];
|
||||
if ($k['inumofagents'] == 0) {
|
||||
continue;
|
||||
}
|
||||
if ($k['ilastseen'] !== NULL && $k['ilastseen'] < $settings['online_timeout']) {
|
||||
if (!$groupid) {
|
||||
$groupid = $k['groupid']; // select first online group
|
||||
}
|
||||
} else {
|
||||
$groupname .= " (offline)";
|
||||
}
|
||||
$isselected = $k['groupid'] == $groupid;
|
||||
$val .= "<option value=\"" . $k['groupid'] . "\"" . ($isselected ? " selected=\"selected\"" : "") . ">$groupname</option>";
|
||||
}
|
||||
$page['groups'] = $val;
|
||||
}
|
||||
|
||||
$page['showemail'] = $settings["surveyaskmail"] == "1" ? "1" : "";
|
||||
$page['showmessage'] = $settings["surveyaskmessage"] == "1" ? "1" : "";
|
||||
$page['showname'] = $settings['usercanchangename'] == "1" ? "1" : "";
|
||||
}
|
||||
|
||||
function setup_chatview_for_user($thread, $level)
|
||||
{
|
||||
global $page, $webimroot, $settings;
|
||||
loadsettings();
|
||||
$page = array();
|
||||
$page['agent'] = false;
|
||||
$page['user'] = true;
|
||||
$page['canpost'] = true;
|
||||
$nameisset = getstring("chat.default.username") != $thread['userName'];
|
||||
$page['displ1'] = $nameisset ? "none" : "inline";
|
||||
$page['displ2'] = $nameisset ? "inline" : "none";
|
||||
$page['level'] = $level;
|
||||
$page['ct.chatThreadId'] = $thread['threadid'];
|
||||
$page['ct.token'] = $thread['ltoken'];
|
||||
$page['ct.user.name'] = htmlspecialchars(topage($thread['userName']));
|
||||
$page['canChangeName'] = $settings['usercanchangename'] == "1";
|
||||
$page['chat.title'] = topage($settings['chattitle']);
|
||||
|
||||
setup_logo();
|
||||
if ($settings['sendmessagekey'] == 'enter') {
|
||||
$page['send_shortcut'] = "Enter";
|
||||
$page['ignorectrl'] = 1;
|
||||
} else {
|
||||
$page['send_shortcut'] = is_mac_opera() ? "⌘-Enter" : "Ctrl-Enter";
|
||||
$page['ignorectrl'] = 0;
|
||||
}
|
||||
|
||||
$params = "thread=" . $thread['threadid'] . "&token=" . $thread['ltoken'];
|
||||
$page['mailLink'] = "$webimroot/client.php?" . $params . "&level=$level&act=mailthread";
|
||||
|
||||
if ($settings['enablessl'] == "1" && !is_secure_request()) {
|
||||
$page['sslLink'] = get_app_location(true, true) . "/client.php?" . $params . "&level=$level";
|
||||
}
|
||||
|
||||
$page['isOpera95'] = is_agent_opera95();
|
||||
$page['neediframesrc'] = needsFramesrc();
|
||||
|
||||
$page['frequency'] = $settings['updatefrequency_chat'];
|
||||
}
|
||||
|
||||
function load_canned_messages($locale, $groupid)
|
||||
{
|
||||
global $mysqlprefix;
|
||||
$link = connect();
|
||||
$result = select_multi_assoc(
|
||||
"select vcvalue from ${mysqlprefix}chatresponses where locale = '$locale' " .
|
||||
"AND (groupid is NULL OR groupid = 0) order by vcvalue", $link);
|
||||
if (count($result) == 0) {
|
||||
foreach (explode("\n", getstring_('chat.predefined_answers', $locale)) as $answer) {
|
||||
$result[] = array('vcvalue' => $answer);
|
||||
}
|
||||
}
|
||||
if ($groupid) {
|
||||
$result2 = select_multi_assoc(
|
||||
"select vcvalue from ${mysqlprefix}chatresponses where locale = '$locale' " .
|
||||
"AND groupid = $groupid order by vcvalue", $link);
|
||||
foreach ($result as $r) {
|
||||
$result2[] = $r;
|
||||
}
|
||||
$result = $result2;
|
||||
}
|
||||
mysql_close($link);
|
||||
return $result;
|
||||
}
|
||||
|
||||
function setup_chatview_for_operator($thread, $operator)
|
||||
{
|
||||
global $page, $webimroot, $company_logo_link, $company_name, $settings;
|
||||
loadsettings();
|
||||
$page = array();
|
||||
$page['agent'] = true;
|
||||
$page['user'] = false;
|
||||
$page['canpost'] = $thread['agentId'] == $operator['operatorid'];
|
||||
$page['ct.chatThreadId'] = $thread['threadid'];
|
||||
$page['ct.token'] = $thread['ltoken'];
|
||||
$page['ct.user.name'] = htmlspecialchars(topage(get_user_name($thread['userName'], $thread['remote'], $thread['userid'])));
|
||||
$page['chat.title'] = topage($settings['chattitle']);
|
||||
|
||||
setup_logo();
|
||||
if ($settings['sendmessagekey'] == 'enter') {
|
||||
$page['send_shortcut'] = "Enter";
|
||||
$page['ignorectrl'] = 1;
|
||||
} else {
|
||||
$page['send_shortcut'] = is_mac_opera() ? "⌘-Enter" : "Ctrl-Enter";
|
||||
$page['ignorectrl'] = 0;
|
||||
}
|
||||
|
||||
if ($settings['enablessl'] == "1" && !is_secure_request()) {
|
||||
$page['sslLink'] = get_app_location(true, true) . "/operator/agent.php?thread=" . $thread['threadid'] . "&token=" . $thread['ltoken'];
|
||||
}
|
||||
$page['isOpera95'] = is_agent_opera95();
|
||||
$page['neediframesrc'] = needsFramesrc();
|
||||
$page['historyParams'] = array("userid" => "" . $thread['userid']);
|
||||
$page['historyParamsLink'] = add_params($webimroot . "/operator/userhistory.php", $page['historyParams']);
|
||||
$predefinedres = "";
|
||||
$canned_messages = load_canned_messages($thread['locale'], $thread['groupid']);
|
||||
foreach ($canned_messages as $answer) {
|
||||
$predefinedres .= "<option>" . htmlspecialchars(topage($answer['vcvalue'])) . "</option>";
|
||||
}
|
||||
$page['predefinedAnswers'] = $predefinedres;
|
||||
$params = "thread=" . $thread['threadid'] . "&token=" . $thread['ltoken'];
|
||||
$page['redirectLink'] = "$webimroot/operator/agent.php?" . $params . "&act=redirect";
|
||||
|
||||
$page['namePostfix'] = "";
|
||||
$page['frequency'] = $settings['updatefrequency_chat'];
|
||||
}
|
||||
|
||||
function update_thread_access($threadid, $params, $link)
|
||||
{
|
||||
global $mysqlprefix;
|
||||
$clause = "";
|
||||
foreach ($params as $k => $v) {
|
||||
if (strlen($clause) > 0)
|
||||
$clause .= ", ";
|
||||
$clause .= $k . "=" . $v;
|
||||
}
|
||||
perform_query(
|
||||
"update ${mysqlprefix}chatthread set $clause " .
|
||||
"where threadid = $threadid", $link);
|
||||
}
|
||||
|
||||
function ping_thread($thread, $isuser, $istyping)
|
||||
{
|
||||
global $kind_for_agent, $state_queue, $state_loading, $state_chatting, $state_waiting, $kind_conn, $connection_timeout;
|
||||
$link = connect();
|
||||
$params = array(($isuser ? "lastpinguser" : "lastpingagent") => "CURRENT_TIMESTAMP",
|
||||
($isuser ? "userTyping" : "agentTyping") => ($istyping ? "1" : "0"));
|
||||
|
||||
$lastping = $thread[$isuser ? "lpagent" : "lpuser"];
|
||||
$current = $thread['current'];
|
||||
|
||||
if ($thread['istate'] == $state_loading && $isuser) {
|
||||
$params['istate'] = $state_queue;
|
||||
commit_thread($thread['threadid'], $params, $link);
|
||||
mysql_close($link);
|
||||
return;
|
||||
}
|
||||
|
||||
if ($lastping > 0 && abs($current - $lastping) > $connection_timeout) {
|
||||
$params[$isuser ? "lastpingagent" : "lastpinguser"] = "0";
|
||||
if (!$isuser) {
|
||||
$message_to_post = getstring_("chat.status.user.dead", $thread['locale']);
|
||||
post_message_($thread['threadid'], $kind_for_agent, $message_to_post, $link, null, $lastping + $connection_timeout);
|
||||
} else if ($thread['istate'] == $state_chatting) {
|
||||
|
||||
$message_to_post = getstring_("chat.status.operator.dead", $thread['locale']);
|
||||
post_message_($thread['threadid'], $kind_conn, $message_to_post, $link, null, $lastping + $connection_timeout);
|
||||
$params['istate'] = $state_waiting;
|
||||
$params['nextagent'] = 0;
|
||||
commit_thread($thread['threadid'], $params, $link);
|
||||
mysql_close($link);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
update_thread_access($thread['threadid'], $params, $link);
|
||||
mysql_close($link);
|
||||
}
|
||||
|
||||
function commit_thread($threadid, $params, $link)
|
||||
{
|
||||
global $mysqlprefix;
|
||||
$query = "update ${mysqlprefix}chatthread t set lrevision = " . next_revision($link) . ", dtmmodified = CURRENT_TIMESTAMP";
|
||||
foreach ($params as $k => $v) {
|
||||
$query .= ", " . $k . "=" . $v;
|
||||
}
|
||||
$query .= " where threadid = $threadid";
|
||||
|
||||
perform_query($query, $link);
|
||||
}
|
||||
|
||||
function rename_user($thread, $newname)
|
||||
{
|
||||
global $kind_events;
|
||||
|
||||
$link = connect();
|
||||
commit_thread($thread['threadid'], array('userName' => "'" . mysql_real_escape_string($newname, $link) . "'"), $link);
|
||||
|
||||
if ($thread['userName'] != $newname) {
|
||||
post_message_($thread['threadid'], $kind_events,
|
||||
getstring2_("chat.status.user.changedname", array($thread['userName'], $newname), $thread['locale']), $link);
|
||||
}
|
||||
mysql_close($link);
|
||||
}
|
||||
|
||||
function close_thread($thread, $isuser)
|
||||
{
|
||||
global $state_closed, $kind_events, $mysqlprefix;
|
||||
|
||||
$link = connect();
|
||||
if ($thread['istate'] != $state_closed) {
|
||||
commit_thread($thread['threadid'], array('istate' => $state_closed,
|
||||
'messageCount' => "(SELECT COUNT(*) FROM ${mysqlprefix}chatmessage WHERE ${mysqlprefix}chatmessage.threadid = t.threadid AND ikind = 1)"), $link);
|
||||
}
|
||||
|
||||
$message = $isuser ? getstring2_("chat.status.user.left", array($thread['userName']), $thread['locale'])
|
||||
: getstring2_("chat.status.operator.left", array($thread['agentName']), $thread['locale']);
|
||||
post_message_($thread['threadid'], $kind_events, $message, $link);
|
||||
mysql_close($link);
|
||||
}
|
||||
|
||||
function close_old_threads($link)
|
||||
{
|
||||
global $state_closed, $state_left, $state_chatting, $mysqlprefix, $settings;
|
||||
if ($settings['thread_lifetime'] == 0) {
|
||||
return;
|
||||
}
|
||||
$next_revision = next_revision($link);
|
||||
$query = "update ${mysqlprefix}chatthread set lrevision = $next_revision, dtmmodified = CURRENT_TIMESTAMP, istate = $state_closed " .
|
||||
"where istate <> $state_closed and istate <> $state_left and lastpingagent <> 0 and lastpinguser <> 0 and " .
|
||||
"(ABS(UNIX_TIMESTAMP(CURRENT_TIMESTAMP) - UNIX_TIMESTAMP(lastpinguser)) > " . $settings['thread_lifetime'] . " and " .
|
||||
"ABS(UNIX_TIMESTAMP(CURRENT_TIMESTAMP) - UNIX_TIMESTAMP(lastpingagent)) > " . $settings['thread_lifetime'] . ")";
|
||||
|
||||
perform_query($query, $link);
|
||||
}
|
||||
|
||||
function thread_by_id_($id, $link)
|
||||
{
|
||||
global $mysqlprefix;
|
||||
return select_one_row("select threadid,userName,agentName,agentId,lrevision,istate,ltoken,userTyping,agentTyping" .
|
||||
",unix_timestamp(dtmmodified) as modified, unix_timestamp(dtmcreated) as created" .
|
||||
",remote,referer,locale,unix_timestamp(lastpinguser) as lpuser,unix_timestamp(lastpingagent) as lpagent, unix_timestamp(CURRENT_TIMESTAMP) as current,nextagent,shownmessageid,userid,userAgent,groupid" .
|
||||
" from ${mysqlprefix}chatthread where threadid = " . $id, $link);
|
||||
}
|
||||
|
||||
function ban_for_addr_($addr, $link)
|
||||
{
|
||||
global $mysqlprefix;
|
||||
return select_one_row("select banid,comment from ${mysqlprefix}chatban where unix_timestamp(dtmtill) > unix_timestamp(CURRENT_TIMESTAMP) AND address = '" . mysql_real_escape_string($addr, $link) . "'", $link);
|
||||
}
|
||||
|
||||
function thread_by_id($id)
|
||||
{
|
||||
$link = connect();
|
||||
$thread = thread_by_id_($id, $link);
|
||||
mysql_close($link);
|
||||
return $thread;
|
||||
}
|
||||
|
||||
function create_thread($groupid, $username, $remoteHost, $referer, $lang, $userid, $userbrowser, $initialState, $link)
|
||||
{
|
||||
global $mysqlprefix;
|
||||
$query = sprintf(
|
||||
"insert into ${mysqlprefix}chatthread (userName,userid,ltoken,remote,referer,lrevision,locale,userAgent,dtmcreated,dtmmodified,istate" . ($groupid ? ",groupid" : "") . ") values " .
|
||||
"('%s','%s',%s,'%s','%s',%s,'%s','%s',CURRENT_TIMESTAMP,CURRENT_TIMESTAMP,$initialState" . ($groupid ? ",$groupid" : "") . ")",
|
||||
mysql_real_escape_string($username, $link),
|
||||
mysql_real_escape_string($userid, $link),
|
||||
next_token(),
|
||||
mysql_real_escape_string($remoteHost, $link),
|
||||
mysql_real_escape_string($referer, $link),
|
||||
next_revision($link),
|
||||
mysql_real_escape_string($lang, $link),
|
||||
mysql_real_escape_string($userbrowser, $link));
|
||||
|
||||
perform_query($query, $link);
|
||||
$id = mysql_insert_id($link);
|
||||
|
||||
$newthread = thread_by_id_($id, $link);
|
||||
return $newthread;
|
||||
}
|
||||
|
||||
function do_take_thread($threadid, $operatorId, $operatorName)
|
||||
{
|
||||
global $state_chatting;
|
||||
$link = connect();
|
||||
commit_thread($threadid,
|
||||
array("istate" => $state_chatting,
|
||||
"nextagent" => 0,
|
||||
"agentId" => $operatorId,
|
||||
"agentName" => "'" . mysql_real_escape_string($operatorName, $link) . "'"), $link);
|
||||
mysql_close($link);
|
||||
}
|
||||
|
||||
function reopen_thread($threadid)
|
||||
{
|
||||
global $state_queue, $state_loading, $state_waiting, $state_chatting, $state_closed, $state_left, $kind_events, $settings;
|
||||
$link = connect();
|
||||
|
||||
$thread = thread_by_id_($threadid, $link);
|
||||
|
||||
if (!$thread)
|
||||
return FALSE;
|
||||
|
||||
if ($settings['thread_lifetime'] != 0 && abs($thread['lpuser'] - time()) > $settings['thread_lifetime'] && abs($thread['lpagent'] - time()) > $settings['thread_lifetime']) {
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if ($thread['istate'] == $state_closed || $thread['istate'] == $state_left)
|
||||
return FALSE;
|
||||
|
||||
if ($thread['istate'] != $state_chatting && $thread['istate'] != $state_queue && $thread['istate'] != $state_loading) {
|
||||
commit_thread($threadid,
|
||||
array("istate" => $state_waiting, "nextagent" => 0), $link);
|
||||
}
|
||||
|
||||
post_message_($thread['threadid'], $kind_events, getstring_("chat.status.user.reopenedthread", $thread['locale']), $link);
|
||||
mysql_close($link);
|
||||
return $thread;
|
||||
}
|
||||
|
||||
function take_thread($thread, $operator)
|
||||
{
|
||||
global $state_queue, $state_loading, $state_waiting, $state_chatting, $kind_events, $kind_avatar, $home_locale;
|
||||
|
||||
$state = $thread['istate'];
|
||||
$threadid = $thread['threadid'];
|
||||
$message_to_post = "";
|
||||
|
||||
$operatorName = ($thread['locale'] == $home_locale) ? $operator['vclocalename'] : $operator['vccommonname'];
|
||||
|
||||
if ($state == $state_queue || $state == $state_waiting || $state == $state_loading) {
|
||||
do_take_thread($threadid, $operator['operatorid'], $operatorName);
|
||||
|
||||
if ($state == $state_waiting) {
|
||||
if ($operatorName != $thread['agentName']) {
|
||||
$message_to_post = getstring2_("chat.status.operator.changed", array($operatorName, $thread['agentName']), $thread['locale']);
|
||||
} else {
|
||||
$message_to_post = getstring2_("chat.status.operator.returned", array($operatorName), $thread['locale']);
|
||||
}
|
||||
} else {
|
||||
$message_to_post = getstring2_("chat.status.operator.joined", array($operatorName), $thread['locale']);
|
||||
}
|
||||
} else if ($state == $state_chatting) {
|
||||
if ($operator['operatorid'] != $thread['agentId']) {
|
||||
do_take_thread($threadid, $operator['operatorid'], $operatorName);
|
||||
$message_to_post = getstring2_("chat.status.operator.changed", array($operatorName, $thread['agentName']), $thread['locale']);
|
||||
}
|
||||
} else {
|
||||
die("cannot take thread");
|
||||
}
|
||||
|
||||
if ($message_to_post) {
|
||||
post_message($threadid, $kind_events, $message_to_post);
|
||||
post_message($threadid, $kind_avatar, $operator['vcavatar'] ? $operator['vcavatar'] : "");
|
||||
}
|
||||
}
|
||||
|
||||
function check_for_reassign($thread, $operator)
|
||||
{
|
||||
global $state_waiting, $home_locale, $kind_events, $kind_avatar;
|
||||
$operatorName = ($thread['locale'] == $home_locale) ? $operator['vclocalename'] : $operator['vccommonname'];
|
||||
if ($thread['istate'] == $state_waiting &&
|
||||
($thread['nextagent'] == $operator['operatorid']
|
||||
|| $thread['agentId'] == $operator['operatorid'])) {
|
||||
do_take_thread($thread['threadid'], $operator['operatorid'], $operatorName);
|
||||
if ($operatorName != $thread['agentName']) {
|
||||
$message_to_post = getstring2_("chat.status.operator.changed", array($operatorName, $thread['agentName']), $thread['locale']);
|
||||
} else {
|
||||
$message_to_post = getstring2_("chat.status.operator.returned", array($operatorName), $thread['locale']);
|
||||
}
|
||||
|
||||
post_message($thread['threadid'], $kind_events, $message_to_post);
|
||||
post_message($thread['threadid'], $kind_avatar, $operator['vcavatar'] ? $operator['vcavatar'] : "");
|
||||
}
|
||||
}
|
||||
|
||||
function notify_operators($thread, $firstmessage, $link)
|
||||
{
|
||||
global $settings, $mysqlprefix;
|
||||
if ($settings['enablejabber'] == 1) {
|
||||
$groupid = $thread['groupid'];
|
||||
$query = "select ${mysqlprefix}chatoperator.operatorid as opid, inotify, vcjabbername, vcemail, (unix_timestamp(CURRENT_TIMESTAMP)-unix_timestamp(dtmlastvisited)) as time from ${mysqlprefix}chatoperator";
|
||||
if ($groupid) {
|
||||
$query .= ", ${mysqlprefix}chatgroupoperator where groupid = $groupid and ${mysqlprefix}chatoperator.operatorid = ${mysqlprefix}chatgroupoperator.operatorid and istatus = 0";
|
||||
} else {
|
||||
$query .= " where istatus = 0";
|
||||
}
|
||||
$query .= " and inotify = 1";
|
||||
$result = select_multi_assoc($query, $link);
|
||||
$text = getstring2_("notify.new.text", array(
|
||||
get_app_location(true, $settings['enablessl'] == '1' && $settings['forcessl'] == '1') . "/operator/agent.php?thread=" . $thread['threadid'],
|
||||
$thread['userName']
|
||||
), $thread['locale']);
|
||||
if ($firstmessage) {
|
||||
$text .= "\n$firstmessage";
|
||||
}
|
||||
foreach ($result as $op) {
|
||||
if ($op['time'] < $settings['online_timeout'] && is_valid_email($op['vcjabbername'])) {
|
||||
webim_xmpp($op['vcjabbername'], getstring2("notify.new.subject", array($thread['userName'])), $text, $link);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function check_connections_from_remote($remote, $link)
|
||||
{
|
||||
global $settings, $state_closed, $state_left, $mysqlprefix;
|
||||
if ($settings['max_connections_from_one_host'] == 0) {
|
||||
return true;
|
||||
}
|
||||
$result = select_one_row(
|
||||
"select count(*) as opened from ${mysqlprefix}chatthread " .
|
||||
"where remote = '" . mysql_real_escape_string($remote, $link) . "' AND istate <> $state_closed AND istate <> $state_left", $link);
|
||||
if ($result && isset($result['opened'])) {
|
||||
return $result['opened'] < $settings['max_connections_from_one_host'];
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
function visitor_from_request()
|
||||
{
|
||||
global $namecookie, $webim_encoding, $usercookie;
|
||||
$defaultName = getstring("chat.default.username");
|
||||
$userName = $defaultName;
|
||||
if (isset($_COOKIE[$namecookie])) {
|
||||
$data = base64_decode(strtr($_COOKIE[$namecookie], '-_,', '+/='));
|
||||
if (strlen($data) > 0) {
|
||||
$userName = myiconv("utf-8", $webim_encoding, $data);
|
||||
}
|
||||
}
|
||||
|
||||
if ($userName == $defaultName) {
|
||||
$userName = getgetparam('name', $userName);
|
||||
}
|
||||
|
||||
if (isset($_COOKIE[$usercookie])) {
|
||||
$userId = $_COOKIE[$usercookie];
|
||||
} else {
|
||||
$userId = get_user_id();
|
||||
setcookie($usercookie, $userId, time() + 60 * 60 * 24 * 365);
|
||||
}
|
||||
return array('id' => $userId, 'name' => $userName);
|
||||
}
|
||||
|
||||
function get_remote_host()
|
||||
{
|
||||
$extAddr = $_SERVER['REMOTE_ADDR'];
|
||||
if (isset($_SERVER['HTTP_X_FORWARDED_FOR']) &&
|
||||
$_SERVER['HTTP_X_FORWARDED_FOR'] != $_SERVER['REMOTE_ADDR']) {
|
||||
$extAddr = $_SERVER['REMOTE_ADDR'] . ' (' . $_SERVER['HTTP_X_FORWARDED_FOR'] . ')';
|
||||
}
|
||||
return isset($_SERVER['REMOTE_HOST']) ? $_SERVER['REMOTE_HOST'] : $extAddr;
|
||||
}
|
||||
|
||||
?>
|
@ -1,732 +0,0 @@
|
||||
<?php
|
||||
/*
|
||||
* Copyright 2005-2013 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
session_start();
|
||||
|
||||
require_once(dirname(__FILE__) . '/converter.php');
|
||||
require_once(dirname(__FILE__) . '/config.php');
|
||||
|
||||
$version = '1.6.5';
|
||||
$jsver = "165";
|
||||
|
||||
function myiconv($in_enc, $out_enc, $string)
|
||||
{
|
||||
global $_utf8win1251, $_win1251utf8;
|
||||
if ($in_enc == $out_enc) {
|
||||
return $string;
|
||||
}
|
||||
if (function_exists('iconv')) {
|
||||
$converted = @iconv($in_enc, $out_enc, $string);
|
||||
if ($converted !== FALSE) {
|
||||
return $converted;
|
||||
}
|
||||
}
|
||||
if ($in_enc == "cp1251" && $out_enc == "utf-8")
|
||||
return strtr($string, $_win1251utf8);
|
||||
if ($in_enc == "utf-8" && $out_enc == "cp1251")
|
||||
return strtr($string, $_utf8win1251);
|
||||
|
||||
return $string; // do not know how to convert
|
||||
}
|
||||
|
||||
function verifyparam($name, $regexp, $default = null)
|
||||
{
|
||||
if (isset($_GET[$name])) {
|
||||
$val = $_GET[$name];
|
||||
if (preg_match($regexp, $val))
|
||||
return $val;
|
||||
|
||||
} else if (isset($_POST[$name])) {
|
||||
$val = $_POST[$name];
|
||||
if (preg_match($regexp, $val))
|
||||
return $val;
|
||||
|
||||
} else {
|
||||
if (isset($default))
|
||||
return $default;
|
||||
}
|
||||
echo "<html><head></head><body>Wrong parameter used or absent: " . $name . "</body></html>";
|
||||
exit;
|
||||
}
|
||||
|
||||
function debugexit_print($var)
|
||||
{
|
||||
echo "<html><body><pre>";
|
||||
print_r($var);
|
||||
echo "</pre></body></html>";
|
||||
exit;
|
||||
}
|
||||
|
||||
$locale_pattern = "/^[\w-]{2,5}$/";
|
||||
|
||||
function locale_exists($locale)
|
||||
{
|
||||
return file_exists(dirname(__FILE__) . "/../locales/$locale/properties");
|
||||
}
|
||||
|
||||
function get_available_locales()
|
||||
{
|
||||
global $locale_pattern;
|
||||
$list = array();
|
||||
$folder = dirname(__FILE__) . "/../locales";
|
||||
if ($handle = opendir($folder)) {
|
||||
while (false !== ($file = readdir($handle))) {
|
||||
if (preg_match($locale_pattern, $file) && $file != 'names' && is_dir("$folder/$file")) {
|
||||
$list[] = $file;
|
||||
}
|
||||
}
|
||||
closedir($handle);
|
||||
}
|
||||
sort($list);
|
||||
return $list;
|
||||
}
|
||||
|
||||
function get_user_locale()
|
||||
{
|
||||
global $default_locale;
|
||||
|
||||
if (isset($_COOKIE['webim_locale'])) {
|
||||
$requested_lang = $_COOKIE['webim_locale'];
|
||||
if (locale_exists($requested_lang))
|
||||
return $requested_lang;
|
||||
}
|
||||
|
||||
if (isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) {
|
||||
$requested_langs = explode(",", $_SERVER['HTTP_ACCEPT_LANGUAGE']);
|
||||
foreach ($requested_langs as $requested_lang) {
|
||||
if (strlen($requested_lang) > 2)
|
||||
$requested_lang = substr($requested_lang, 0, 2);
|
||||
|
||||
if (locale_exists($requested_lang))
|
||||
return $requested_lang;
|
||||
}
|
||||
}
|
||||
|
||||
if (locale_exists($default_locale))
|
||||
return $default_locale;
|
||||
|
||||
return 'en';
|
||||
}
|
||||
|
||||
function get_locale()
|
||||
{
|
||||
global $webimroot, $locale_pattern;
|
||||
|
||||
$locale = verifyparam("locale", $locale_pattern, "");
|
||||
|
||||
if ($locale && locale_exists($locale)) {
|
||||
$_SESSION['locale'] = $locale;
|
||||
setcookie('webim_locale', $locale, time() + 60 * 60 * 24 * 1000, "$webimroot/");
|
||||
} else if (isset($_SESSION['locale'])) {
|
||||
$locale = $_SESSION['locale'];
|
||||
}
|
||||
|
||||
if (!$locale || !locale_exists($locale))
|
||||
$locale = get_user_locale();
|
||||
return $locale;
|
||||
}
|
||||
|
||||
$current_locale = get_locale();
|
||||
$messages = array();
|
||||
$output_encoding = array();
|
||||
|
||||
if (function_exists("date_default_timezone_set")) {
|
||||
// TODO try to get timezone from config.php/session etc.
|
||||
// autodetect timezone
|
||||
@date_default_timezone_set(function_exists("date_default_timezone_get") ? @date_default_timezone_get() : "GMT");
|
||||
}
|
||||
|
||||
function get_locale_links($href)
|
||||
{
|
||||
global $current_locale;
|
||||
$localeLinks = array();
|
||||
$allLocales = get_available_locales();
|
||||
if (count($allLocales) < 2) {
|
||||
return null;
|
||||
}
|
||||
foreach ($allLocales as $k) {
|
||||
$localeLinks[$k] = getlocal_($k, "names");
|
||||
}
|
||||
return $localeLinks;
|
||||
}
|
||||
|
||||
function load_messages($locale)
|
||||
{
|
||||
global $messages, $webim_encoding, $output_encoding;
|
||||
$hash = array();
|
||||
$current_encoding = $webim_encoding;
|
||||
$fp = fopen(dirname(__FILE__) . "/../locales/$locale/properties", "r");
|
||||
while (!feof($fp)) {
|
||||
$line = fgets($fp, 4096);
|
||||
$keyval = preg_split("/=/", $line, 2);
|
||||
if (isset($keyval[1])) {
|
||||
if ($keyval[0] == 'encoding') {
|
||||
$current_encoding = trim($keyval[1]);
|
||||
} else if ($keyval[0] == 'output_encoding') {
|
||||
$output_encoding[$locale] = trim($keyval[1]);
|
||||
} else if ($current_encoding == $webim_encoding) {
|
||||
$hash[$keyval[0]] = str_replace("\\n", "\n", trim($keyval[1]));
|
||||
} else {
|
||||
$hash[$keyval[0]] = myiconv($current_encoding, $webim_encoding, str_replace("\\n", "\n", trim($keyval[1])));
|
||||
}
|
||||
}
|
||||
}
|
||||
fclose($fp);
|
||||
$messages[$locale] = $hash;
|
||||
}
|
||||
|
||||
function getoutputenc()
|
||||
{
|
||||
global $current_locale, $output_encoding, $webim_encoding, $messages;
|
||||
if (!isset($messages[$current_locale]))
|
||||
load_messages($current_locale);
|
||||
return isset($output_encoding[$current_locale]) ? $output_encoding[$current_locale] : $webim_encoding;
|
||||
}
|
||||
|
||||
function getstring_($text, $locale)
|
||||
{
|
||||
global $messages;
|
||||
if (!isset($messages[$locale]))
|
||||
load_messages($locale);
|
||||
|
||||
$localized = $messages[$locale];
|
||||
if (isset($localized[$text]))
|
||||
return $localized[$text];
|
||||
if ($locale != 'en') {
|
||||
return getstring_($text, 'en');
|
||||
}
|
||||
|
||||
return "!" . $text;
|
||||
}
|
||||
|
||||
function getstring($text)
|
||||
{
|
||||
global $current_locale;
|
||||
return getstring_($text, $current_locale);
|
||||
}
|
||||
|
||||
function getlocal($text)
|
||||
{
|
||||
global $current_locale, $webim_encoding;
|
||||
return myiconv($webim_encoding, getoutputenc(), getstring_($text, $current_locale));
|
||||
}
|
||||
|
||||
function getlocal_($text, $locale)
|
||||
{
|
||||
global $webim_encoding;
|
||||
return myiconv($webim_encoding, getoutputenc(), getstring_($text, $locale));
|
||||
}
|
||||
|
||||
function topage($text)
|
||||
{
|
||||
global $webim_encoding;
|
||||
return myiconv($webim_encoding, getoutputenc(), $text);
|
||||
}
|
||||
|
||||
function getstring2_($text, $params, $locale)
|
||||
{
|
||||
$string = getstring_($text, $locale);
|
||||
for ($i = 0; $i < count($params); $i++) {
|
||||
$string = str_replace("{" . $i . "}", $params[$i], $string);
|
||||
}
|
||||
return $string;
|
||||
}
|
||||
|
||||
function getstring2($text, $params)
|
||||
{
|
||||
global $current_locale;
|
||||
return getstring2_($text, $params, $current_locale);
|
||||
}
|
||||
|
||||
function getlocal2($text, $params)
|
||||
{
|
||||
global $current_locale, $webim_encoding;
|
||||
$string = myiconv($webim_encoding, getoutputenc(), getstring_($text, $current_locale));
|
||||
for ($i = 0; $i < count($params); $i++) {
|
||||
$string = str_replace("{" . $i . "}", $params[$i], $string);
|
||||
}
|
||||
return $string;
|
||||
}
|
||||
|
||||
/* prepares for Javascript string */
|
||||
function getlocalforJS($text, $params)
|
||||
{
|
||||
global $current_locale, $webim_encoding;
|
||||
$string = myiconv($webim_encoding, getoutputenc(), getstring_($text, $current_locale));
|
||||
$string = str_replace("\"", "\\\"", str_replace("\n", "\\n", $string));
|
||||
for ($i = 0; $i < count($params); $i++) {
|
||||
$string = str_replace("{" . $i . "}", $params[$i], $string);
|
||||
}
|
||||
return $string;
|
||||
}
|
||||
|
||||
/* ajax server actions use utf-8 */
|
||||
function getrawparam($name)
|
||||
{
|
||||
global $webim_encoding;
|
||||
if (isset($_POST[$name])) {
|
||||
$value = myiconv("utf-8", $webim_encoding, $_POST[$name]);
|
||||
if (get_magic_quotes_gpc()) {
|
||||
$value = stripslashes($value);
|
||||
}
|
||||
return $value;
|
||||
}
|
||||
die("no " . $name . " parameter");
|
||||
}
|
||||
|
||||
/* form processors use current Output encoding */
|
||||
function getparam($name)
|
||||
{
|
||||
global $webim_encoding;
|
||||
if (isset($_POST[$name])) {
|
||||
$value = myiconv(getoutputenc(), $webim_encoding, $_POST[$name]);
|
||||
if (get_magic_quotes_gpc()) {
|
||||
$value = stripslashes($value);
|
||||
}
|
||||
return $value;
|
||||
}
|
||||
die("no " . $name . " parameter");
|
||||
}
|
||||
|
||||
function unicode_urldecode($url)
|
||||
{
|
||||
preg_match_all('/%u([[:alnum:]]{4})/', $url, $a);
|
||||
|
||||
foreach ($a[1] as $uniord) {
|
||||
$dec = hexdec($uniord);
|
||||
$utf = '';
|
||||
|
||||
if ($dec < 128) {
|
||||
$utf = chr($dec);
|
||||
} else if ($dec < 2048) {
|
||||
$utf = chr(192 + (($dec - ($dec % 64)) / 64));
|
||||
$utf .= chr(128 + ($dec % 64));
|
||||
} else {
|
||||
$utf = chr(224 + (($dec - ($dec % 4096)) / 4096));
|
||||
$utf .= chr(128 + ((($dec % 4096) - ($dec % 64)) / 64));
|
||||
$utf .= chr(128 + ($dec % 64));
|
||||
}
|
||||
$url = str_replace('%u' . $uniord, $utf, $url);
|
||||
}
|
||||
return urldecode($url);
|
||||
}
|
||||
|
||||
function getgetparam($name, $default = '')
|
||||
{
|
||||
global $webim_encoding;
|
||||
if (!isset($_GET[$name]) || !$_GET[$name]) {
|
||||
return $default;
|
||||
}
|
||||
$value = myiconv("utf-8", $webim_encoding, unicode_urldecode($_GET[$name]));
|
||||
if (get_magic_quotes_gpc()) {
|
||||
$value = stripslashes($value);
|
||||
}
|
||||
return $value;
|
||||
}
|
||||
|
||||
function connect()
|
||||
{
|
||||
global $mysqlhost, $mysqllogin, $mysqlpass, $mysqldb, $dbencoding, $force_charset_in_connection;
|
||||
if (!extension_loaded("mysql")) {
|
||||
die('Mysql extension is not loaded');
|
||||
}
|
||||
$link = @mysql_connect($mysqlhost, $mysqllogin, $mysqlpass)
|
||||
or die('Could not connect: ' . mysql_error());
|
||||
mysql_select_db($mysqldb, $link) or die('Could not select database');
|
||||
if ($force_charset_in_connection) {
|
||||
mysql_query("SET NAMES '$dbencoding'", $link);
|
||||
}
|
||||
return $link;
|
||||
}
|
||||
|
||||
function perform_query($query, $link)
|
||||
{
|
||||
mysql_query($query, $link) or die(' Query failed: ' . mysql_error($link));
|
||||
}
|
||||
|
||||
function select_one_row($query, $link)
|
||||
{
|
||||
$result = mysql_query($query, $link) or die(' Query failed: ' . mysql_error($link));
|
||||
$line = mysql_fetch_array($result, MYSQL_ASSOC);
|
||||
mysql_free_result($result);
|
||||
return $line;
|
||||
}
|
||||
|
||||
function select_multi_assoc($query, $link)
|
||||
{
|
||||
$sqlresult = mysql_query($query, $link) or die(' Query failed: ' . mysql_error($link));
|
||||
|
||||
$result = array();
|
||||
while ($row = mysql_fetch_array($sqlresult, MYSQL_ASSOC)) {
|
||||
$result[] = $row;
|
||||
}
|
||||
mysql_free_result($sqlresult);
|
||||
return $result;
|
||||
}
|
||||
|
||||
function db_build_select($fields, $table, $conditions, $orderandgroup)
|
||||
{
|
||||
$condition = count($conditions) > 0 ? " where " . implode(" and ", $conditions) : "";
|
||||
if ($orderandgroup) $orderandgroup = " " . $orderandgroup;
|
||||
return "select $fields from $table$condition$orderandgroup";
|
||||
}
|
||||
|
||||
function db_rows_count($table, $conditions, $countfields, $link)
|
||||
{
|
||||
$result = mysql_query(db_build_select("count(" . ($countfields ? $countfields : "*") . ")", $table, $conditions, ""), $link)
|
||||
or die(' Count query failed: ' . mysql_error($link));
|
||||
$line = mysql_fetch_array($result, MYSQL_NUM);
|
||||
mysql_free_result($result);
|
||||
return $line[0];
|
||||
}
|
||||
|
||||
function start_xml_output()
|
||||
{
|
||||
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: text/xml; charset=utf-8");
|
||||
echo "<?xml version=\"1.0\" encoding=\"UTF-8\"?>";
|
||||
}
|
||||
|
||||
function start_html_output()
|
||||
{
|
||||
$charset = getstring("output_charset");
|
||||
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: text/html" . (isset($charset) ? "; charset=" . $charset : ""));
|
||||
}
|
||||
|
||||
function escape_with_cdata($text)
|
||||
{
|
||||
return "<![CDATA[" . str_replace("]]>", "]]>]]><![CDATA[", $text) . "]]>";
|
||||
}
|
||||
|
||||
function form_value($key)
|
||||
{
|
||||
global $page;
|
||||
if (isset($page) && isset($page["form$key"]))
|
||||
return htmlspecialchars($page["form$key"]);
|
||||
return "";
|
||||
}
|
||||
|
||||
function form_value_cb($key)
|
||||
{
|
||||
global $page;
|
||||
if (isset($page) && isset($page["form$key"]))
|
||||
return $page["form$key"] === true;
|
||||
return false;
|
||||
}
|
||||
|
||||
function form_value_mb($key, $id)
|
||||
{
|
||||
global $page;
|
||||
if (isset($page) && isset($page["form$key"]) && is_array($page["form$key"])) {
|
||||
return in_array($id, $page["form$key"]);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
function no_field($key)
|
||||
{
|
||||
return getlocal2("errors.required", array(getlocal($key)));
|
||||
}
|
||||
|
||||
function failed_uploading_file($filename, $key)
|
||||
{
|
||||
return getlocal2("errors.failed.uploading.file",
|
||||
array($filename, getlocal($key)));
|
||||
}
|
||||
|
||||
function wrong_field($key)
|
||||
{
|
||||
return getlocal2("errors.wrong_field", array(getlocal($key)));
|
||||
}
|
||||
|
||||
function get_popup($href, $jshref, $message, $title, $wndName, $options)
|
||||
{
|
||||
if (!$jshref) {
|
||||
$jshref = "'$href'";
|
||||
}
|
||||
return "<a href=\"$href\" target=\"_blank\" " . ($title ? "title=\"$title\" " : "") . "onclick=\"if(navigator.userAgent.toLowerCase().indexOf('opera') != -1 && window.event.preventDefault) window.event.preventDefault();this.newWindow = window.open($jshref, '$wndName', '$options');this.newWindow.focus();this.newWindow.opener=window;return false;\">$message</a>";
|
||||
}
|
||||
|
||||
function get_image($href, $width, $height)
|
||||
{
|
||||
if ($width != 0 && $height != 0)
|
||||
return "<img src=\"$href\" border=\"0\" width=\"$width\" height=\"$height\" alt=\"\"/>";
|
||||
return "<img src=\"$href\" border=\"0\" alt=\"\"/>";
|
||||
}
|
||||
|
||||
function get_gifimage_size($filename)
|
||||
{
|
||||
if (function_exists('gd_info')) {
|
||||
$info = gd_info();
|
||||
if (isset($info['GIF Read Support']) && $info['GIF Read Support']) {
|
||||
$img = @imagecreatefromgif($filename);
|
||||
if ($img) {
|
||||
$height = imagesy($img);
|
||||
$width = imagesx($img);
|
||||
imagedestroy($img);
|
||||
return array($width, $height);
|
||||
}
|
||||
}
|
||||
}
|
||||
return array(0, 0);
|
||||
}
|
||||
|
||||
function add_params($servlet, $params)
|
||||
{
|
||||
$infix = '?';
|
||||
if (strstr($servlet, $infix) !== FALSE)
|
||||
$infix = '&';
|
||||
foreach ($params as $k => $v) {
|
||||
$servlet .= $infix . $k . "=" . $v;
|
||||
$infix = '&';
|
||||
}
|
||||
return $servlet;
|
||||
}
|
||||
|
||||
function div($a, $b)
|
||||
{
|
||||
return ($a - ($a % $b)) / $b;
|
||||
}
|
||||
|
||||
function date_diff_to_text($seconds)
|
||||
{
|
||||
$minutes = div($seconds, 60);
|
||||
$seconds = $seconds % 60;
|
||||
if ($minutes < 60) {
|
||||
return sprintf("%02d:%02d", $minutes, $seconds);
|
||||
} else {
|
||||
$hours = div($minutes, 60);
|
||||
$minutes = $minutes % 60;
|
||||
return sprintf("%02d:%02d:%02d", $hours, $minutes, $seconds);
|
||||
}
|
||||
}
|
||||
|
||||
function is_valid_email($email)
|
||||
{
|
||||
return preg_match("/^[^@]+@[^\.]+(\.[^\.]+)*$/", $email);
|
||||
}
|
||||
|
||||
function get_app_location($showhost, $issecure)
|
||||
{
|
||||
global $webimroot;
|
||||
if ($showhost) {
|
||||
return ($issecure ? "https://" : "http://") . $_SERVER['HTTP_HOST'] . $webimroot;
|
||||
} else {
|
||||
return $webimroot;
|
||||
}
|
||||
}
|
||||
|
||||
function is_secure_request()
|
||||
{
|
||||
return
|
||||
isset($_SERVER['SERVER_PORT']) && $_SERVER['SERVER_PORT'] == '443'
|
||||
|| isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == "on"
|
||||
|| isset($_SERVER["HTTP_HTTPS"]) && $_SERVER["HTTP_HTTPS"] == "on";
|
||||
}
|
||||
|
||||
function get_month_selection($fromtime, $totime)
|
||||
{
|
||||
$start = getdate($fromtime);
|
||||
$month = $start['mon'];
|
||||
$year = $start['year'];
|
||||
$result = array();
|
||||
do {
|
||||
$current = mktime(0, 0, 0, $month, 1, $year);
|
||||
$result[date("m.y", $current)] = strftime("%B, %Y", $current);
|
||||
$month++;
|
||||
if ($month > 12) {
|
||||
$month = 1;
|
||||
$year++;
|
||||
}
|
||||
} while ($current < $totime);
|
||||
return $result;
|
||||
}
|
||||
|
||||
function get_form_date($day, $month)
|
||||
{
|
||||
if (preg_match('/^(\d{2}).(\d{2})$/', $month, $matches)) {
|
||||
return mktime(0, 0, 0, $matches[1], $day, $matches[2]);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
function set_form_date($utime, $prefix)
|
||||
{
|
||||
global $page;
|
||||
$page["form${prefix}day"] = date("d", $utime);
|
||||
$page["form${prefix}month"] = date("m.y", $utime);
|
||||
}
|
||||
|
||||
function date_to_text($unixtime)
|
||||
{
|
||||
if ($unixtime < 60 * 60 * 24 * 30)
|
||||
return getlocal("time.never");
|
||||
|
||||
$then = getdate($unixtime);
|
||||
$now = getdate();
|
||||
|
||||
if ($then['yday'] == $now['yday'] && $then['year'] == $now['year']) {
|
||||
$date_format = getlocal("time.today.at");
|
||||
} else if (($then['yday'] + 1) == $now['yday'] && $then['year'] == $now['year']) {
|
||||
$date_format = getlocal("time.yesterday.at");
|
||||
} else {
|
||||
$date_format = getlocal("time.dateformat");
|
||||
}
|
||||
|
||||
return strftime($date_format . " " . getlocal("time.timeformat"), $unixtime);
|
||||
}
|
||||
|
||||
$dbversion = '1.6.5';
|
||||
$featuresversion = '1.6.5';
|
||||
|
||||
$settings = array(
|
||||
'dbversion' => 0,
|
||||
'featuresversion' => 0,
|
||||
'title' => 'Your Company',
|
||||
'hosturl' => 'http://mibew.org',
|
||||
'logo' => '',
|
||||
'usernamepattern' => '{name}',
|
||||
'chatstyle' => 'default',
|
||||
'chattitle' => 'Live Support',
|
||||
'geolink' => 'http://api.hostip.info/get_html.php?ip={ip}',
|
||||
'geolinkparams' => 'width=440,height=100,toolbar=0,scrollbars=0,location=0,status=1,menubar=0,resizable=1',
|
||||
'max_uploaded_file_size' => 100000,
|
||||
'max_connections_from_one_host' => 10,
|
||||
'thread_lifetime' => 600,
|
||||
|
||||
'email' => '', /* inbox for left messages */
|
||||
'left_messages_locale' => $home_locale,
|
||||
'sendmessagekey' => 'center',
|
||||
|
||||
'enableban' => '0',
|
||||
'enablessl' => '0',
|
||||
'forcessl' => '0',
|
||||
'usercanchangename' => '1',
|
||||
'enablegroups' => '0',
|
||||
'enablestatistics' => '1',
|
||||
'enablejabber' => '0',
|
||||
'enablepresurvey' => '1',
|
||||
'surveyaskmail' => '0',
|
||||
'surveyaskgroup' => '1',
|
||||
'surveyaskmessage' => '0',
|
||||
'enablepopupnotification' => '0',
|
||||
'showonlineoperators' => '0',
|
||||
'enablecaptcha' => '0',
|
||||
|
||||
'online_timeout' => 30, /* Timeout (in seconds) when online operator becomes offline */
|
||||
'updatefrequency_operator' => 2,
|
||||
'updatefrequency_chat' => 2,
|
||||
'updatefrequency_oldchat' => 7,
|
||||
);
|
||||
$settingsloaded = false;
|
||||
$settings_in_db = array();
|
||||
|
||||
function loadsettings_($link)
|
||||
{
|
||||
global $settingsloaded, $settings_in_db, $settings, $mysqlprefix;
|
||||
if ($settingsloaded) {
|
||||
return;
|
||||
}
|
||||
$settingsloaded = true;
|
||||
|
||||
$sqlresult = mysql_query("select vckey,vcvalue from ${mysqlprefix}chatconfig", $link) or die(' Query failed: ' . mysql_error($link));
|
||||
|
||||
while ($row = mysql_fetch_array($sqlresult, MYSQL_ASSOC)) {
|
||||
$name = $row['vckey'];
|
||||
$settings[$name] = $row['vcvalue'];
|
||||
$settings_in_db[$name] = true;
|
||||
}
|
||||
mysql_free_result($sqlresult);
|
||||
}
|
||||
|
||||
function loadsettings()
|
||||
{
|
||||
global $settingsloaded;
|
||||
if (!$settingsloaded) {
|
||||
$link = connect();
|
||||
loadsettings_($link);
|
||||
mysql_close($link);
|
||||
}
|
||||
}
|
||||
|
||||
function getchatstyle()
|
||||
{
|
||||
global $settings;
|
||||
$chatstyle = verifyparam("style", "/^\w+$/", "");
|
||||
if ($chatstyle) {
|
||||
return $chatstyle;
|
||||
}
|
||||
loadsettings();
|
||||
return $settings['chatstyle'];
|
||||
}
|
||||
|
||||
function jspath()
|
||||
{
|
||||
global $jsver;
|
||||
return "js/$jsver";
|
||||
}
|
||||
|
||||
/* authorization token check for CSRF attack */
|
||||
function csrfchecktoken()
|
||||
{
|
||||
setcsrftoken();
|
||||
|
||||
// check the turing code for post requests and del requests
|
||||
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
|
||||
//if token match
|
||||
if (!isset($_POST['csrf_token']) || ($_POST['csrf_token'] != $_SESSION['csrf_token'])) {
|
||||
|
||||
die("CSRF failure");
|
||||
}
|
||||
} else if (isset($_GET['act'])) {
|
||||
if (($_GET['act'] == 'del' || $_GET['act'] == 'delete') && $_GET['csrf_token'] != $_SESSION['csrf_token']) {
|
||||
|
||||
die("CSRF failure");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* print csrf token as a hidden field*/
|
||||
function print_csrf_token_input()
|
||||
{
|
||||
setcsrftoken();
|
||||
|
||||
echo "<input name='csrf_token' type='hidden' value='" . $_SESSION['csrf_token'] . "' />\n";
|
||||
}
|
||||
|
||||
/* print csrf token in url format */
|
||||
function print_csrf_token_in_url()
|
||||
{
|
||||
setcsrftoken();
|
||||
|
||||
echo "&csrf_token=" . $_SESSION['csrf_token'];
|
||||
}
|
||||
|
||||
/* set csrf token */
|
||||
function setcsrftoken()
|
||||
{
|
||||
if (!isset($_SESSION['csrf_token'])) {
|
||||
$_SESSION['csrf_token'] = sha1(rand(10000000, 99999999));
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
@ -1,52 +0,0 @@
|
||||
<?php
|
||||
/*
|
||||
* Copyright 2005-2013 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Application path on server
|
||||
*/
|
||||
$webimroot = "/webim";
|
||||
|
||||
/*
|
||||
* Internal encoding
|
||||
*/
|
||||
$webim_encoding = "utf-8";
|
||||
|
||||
/*
|
||||
* MySQL Database parameters
|
||||
*/
|
||||
$mysqlhost = "localhost";
|
||||
$mysqldb = "webim_db";
|
||||
$mysqllogin = "webim_lite";
|
||||
$mysqlpass = "123";
|
||||
$mysqlprefix = "";
|
||||
|
||||
$dbencoding = "utf8";
|
||||
$force_charset_in_connection = true;
|
||||
|
||||
/*
|
||||
* Mailbox
|
||||
*/
|
||||
$webim_mailbox = "webim@yourdomain.com";
|
||||
$mail_encoding = "utf-8";
|
||||
|
||||
/*
|
||||
* Locales
|
||||
*/
|
||||
$home_locale = "en"; /* native name will be used in this locale */
|
||||
$default_locale = "en"; /* if user does not provide known lang */
|
||||
|
||||
?>
|
@ -1,51 +0,0 @@
|
||||
<?php
|
||||
/*
|
||||
* Copyright 2005-2013 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
$_utf8win1251 = array(
|
||||
"\xD0\x90" => "\xC0", "\xD0\x91" => "\xC1", "\xD0\x92" => "\xC2", "\xD0\x93" => "\xC3", "\xD0\x94" => "\xC4",
|
||||
"\xD0\x95" => "\xC5", "\xD0\x81" => "\xA8", "\xD0\x96" => "\xC6", "\xD0\x97" => "\xC7", "\xD0\x98" => "\xC8",
|
||||
"\xD0\x99" => "\xC9", "\xD0\x9A" => "\xCA", "\xD0\x9B" => "\xCB", "\xD0\x9C" => "\xCC", "\xD0\x9D" => "\xCD",
|
||||
"\xD0\x9E" => "\xCE", "\xD0\x9F" => "\xCF", "\xD0\xA0" => "\xD0", "\xD0\xA1" => "\xD1", "\xD0\xA2" => "\xD2",
|
||||
"\xD0\xA3" => "\xD3", "\xD0\xA4" => "\xD4", "\xD0\xA5" => "\xD5", "\xD0\xA6" => "\xD6", "\xD0\xA7" => "\xD7",
|
||||
"\xD0\xA8" => "\xD8", "\xD0\xA9" => "\xD9", "\xD0\xAA" => "\xDA", "\xD0\xAB" => "\xDB", "\xD0\xAC" => "\xDC",
|
||||
"\xD0\xAD" => "\xDD", "\xD0\xAE" => "\xDE", "\xD0\xAF" => "\xDF", "\xD0\x87" => "\xAF", "\xD0\x86" => "\xB2",
|
||||
"\xD0\x84" => "\xAA", "\xD0\x8E" => "\xA1", "\xD0\xB0" => "\xE0", "\xD0\xB1" => "\xE1", "\xD0\xB2" => "\xE2",
|
||||
"\xD0\xB3" => "\xE3", "\xD0\xB4" => "\xE4", "\xD0\xB5" => "\xE5", "\xD1\x91" => "\xB8", "\xD0\xB6" => "\xE6",
|
||||
"\xD0\xB7" => "\xE7", "\xD0\xB8" => "\xE8", "\xD0\xB9" => "\xE9", "\xD0\xBA" => "\xEA", "\xD0\xBB" => "\xEB",
|
||||
"\xD0\xBC" => "\xEC", "\xD0\xBD" => "\xED", "\xD0\xBE" => "\xEE", "\xD0\xBF" => "\xEF", "\xD1\x80" => "\xF0",
|
||||
"\xD1\x81" => "\xF1", "\xD1\x82" => "\xF2", "\xD1\x83" => "\xF3", "\xD1\x84" => "\xF4", "\xD1\x85" => "\xF5",
|
||||
"\xD1\x86" => "\xF6", "\xD1\x87" => "\xF7", "\xD1\x88" => "\xF8", "\xD1\x89" => "\xF9", "\xD1\x8A" => "\xFA",
|
||||
"\xD1\x8B" => "\xFB", "\xD1\x8C" => "\xFC", "\xD1\x8D" => "\xFD", "\xD1\x8E" => "\xFE", "\xD1\x8F" => "\xFF",
|
||||
"\xD1\x96" => "\xB3", "\xD1\x97" => "\xBF", "\xD1\x94" => "\xBA", "\xD1\x9E" => "\xA2");
|
||||
$_win1251utf8 = array(
|
||||
"\xC0" => "\xD0\x90", "\xC1" => "\xD0\x91", "\xC2" => "\xD0\x92", "\xC3" => "\xD0\x93", "\xC4" => "\xD0\x94",
|
||||
"\xC5" => "\xD0\x95", "\xA8" => "\xD0\x81", "\xC6" => "\xD0\x96", "\xC7" => "\xD0\x97", "\xC8" => "\xD0\x98",
|
||||
"\xC9" => "\xD0\x99", "\xCA" => "\xD0\x9A", "\xCB" => "\xD0\x9B", "\xCC" => "\xD0\x9C", "\xCD" => "\xD0\x9D",
|
||||
"\xCE" => "\xD0\x9E", "\xCF" => "\xD0\x9F", "\xD0" => "\xD0\xA0", "\xD1" => "\xD0\xA1", "\xD2" => "\xD0\xA2",
|
||||
"\xD3" => "\xD0\xA3", "\xD4" => "\xD0\xA4", "\xD5" => "\xD0\xA5", "\xD6" => "\xD0\xA6", "\xD7" => "\xD0\xA7",
|
||||
"\xD8" => "\xD0\xA8", "\xD9" => "\xD0\xA9", "\xDA" => "\xD0\xAA", "\xDB" => "\xD0\xAB", "\xDC" => "\xD0\xAC",
|
||||
"\xDD" => "\xD0\xAD", "\xDE" => "\xD0\xAE", "\xDF" => "\xD0\xAF", "\xAF" => "\xD0\x87", "\xB2" => "\xD0\x86",
|
||||
"\xAA" => "\xD0\x84", "\xA1" => "\xD0\x8E", "\xE0" => "\xD0\xB0", "\xE1" => "\xD0\xB1", "\xE2" => "\xD0\xB2",
|
||||
"\xE3" => "\xD0\xB3", "\xE4" => "\xD0\xB4", "\xE5" => "\xD0\xB5", "\xB8" => "\xD1\x91", "\xE6" => "\xD0\xB6",
|
||||
"\xE7" => "\xD0\xB7", "\xE8" => "\xD0\xB8", "\xE9" => "\xD0\xB9", "\xEA" => "\xD0\xBA", "\xEB" => "\xD0\xBB",
|
||||
"\xEC" => "\xD0\xBC", "\xED" => "\xD0\xBD", "\xEE" => "\xD0\xBE", "\xEF" => "\xD0\xBF", "\xF0" => "\xD1\x80",
|
||||
"\xF1" => "\xD1\x81", "\xF2" => "\xD1\x82", "\xF3" => "\xD1\x83", "\xF4" => "\xD1\x84", "\xF5" => "\xD1\x85",
|
||||
"\xF6" => "\xD1\x86", "\xF7" => "\xD1\x87", "\xF8" => "\xD1\x88", "\xF9" => "\xD1\x89", "\xFA" => "\xD1\x8A",
|
||||
"\xFB" => "\xD1\x8B", "\xFC" => "\xD1\x8C", "\xFD" => "\xD1\x8D", "\xFE" => "\xD1\x8E", "\xFF" => "\xD1\x8F",
|
||||
"\xB3" => "\xD1\x96", "\xBF" => "\xD1\x97", "\xBA" => "\xD1\x94", "\xA2" => "\xD1\x9E");
|
||||
|
||||
?>
|
@ -1,90 +0,0 @@
|
||||
<?php
|
||||
/*
|
||||
* Copyright 2005-2013 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
function demo_print_message($msg, $format)
|
||||
{
|
||||
global $webim_encoding;
|
||||
if ($format == "xml") {
|
||||
print "<message>" . myiconv($webim_encoding, "utf-8", escape_with_cdata(message_to_html($msg))) . "</message>\n";
|
||||
} else {
|
||||
print topage(message_to_html($msg));
|
||||
}
|
||||
}
|
||||
|
||||
function demo_process_thread($act, $outformat, $lastid, $isuser, $canpost, $istyping, $postmessage)
|
||||
{
|
||||
global $kind_for_agent, $kind_info, $kind_events, $kind_user, $kind_agent, $webimroot, $settings;
|
||||
loadsettings();
|
||||
if ($act == "refresh" || $act == "post") {
|
||||
$lastid++;
|
||||
if ($outformat == "xml") {
|
||||
start_xml_output();
|
||||
print("<thread lastid=\"$lastid\" typing=\"" . ($istyping ? 1 : 0) . "\" canpost=\"" . ($canpost ? 1 : 0) . "\">");
|
||||
} else {
|
||||
start_html_output();
|
||||
$url = "$webimroot/thread.php?act=refresh&thread=0&token=123&html=on&user=" . ($isuser ? "true" : "false");
|
||||
|
||||
print(
|
||||
"<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">" .
|
||||
"<html>\n<head>\n" .
|
||||
"<link href=\"$webimroot/styles/default/chat.css\" rel=\"stylesheet\" type=\"text/css\">\n" .
|
||||
"<meta http-equiv=\"Refresh\" content=\"" . $settings['updatefrequency_oldchat'] . "; URL=$url&sn=11\">\n" .
|
||||
"<meta http-equiv=\"Pragma\" content=\"no-cache\">\n" .
|
||||
"<title>chat</title>\n" .
|
||||
"</head>\n" .
|
||||
"<body bgcolor='#FFFFFF' text='#000000' link='#C28400' vlink='#C28400' alink='#C28400'>" .
|
||||
"<table width='100%' cellspacing='0' cellpadding='0' border='0'><tr><td valign='top' class='message'>");
|
||||
|
||||
}
|
||||
if ($lastid == 1) {
|
||||
demo_print_message(
|
||||
array('ikind' => $kind_for_agent, 'created' => time() - 15, 'tname' => '',
|
||||
'tmessage' => getstring2('chat.came.from', array("http://google.com"))), $outformat);
|
||||
demo_print_message(
|
||||
array('ikind' => $kind_info, 'created' => time() - 15, 'tname' => '',
|
||||
'tmessage' => getstring('chat.wait')), $outformat);
|
||||
demo_print_message(
|
||||
array('ikind' => $kind_events, 'created' => time() - 10, 'tname' => '',
|
||||
'tmessage' => getstring2("chat.status.operator.joined", array("Administrator"))), $outformat);
|
||||
demo_print_message(
|
||||
array('ikind' => $kind_agent, 'created' => time() - 9, 'tname' => 'Administrator',
|
||||
'tmessage' => getstring("demo.chat.welcome")), $outformat);
|
||||
demo_print_message(
|
||||
array('ikind' => $kind_user, 'created' => time() - 5, 'tname' => getstring("chat.default.username"),
|
||||
'tmessage' => getstring("demo.chat.question")), $outformat);
|
||||
if ($canpost && $outformat == 'xml') {
|
||||
demo_print_message(
|
||||
array('ikind' => $kind_info, 'created' => time() - 5, 'tname' => '',
|
||||
'tmessage' => 'Hint: type something in message field to see typing notification'), $outformat);
|
||||
}
|
||||
}
|
||||
if ($act == 'post') {
|
||||
demo_print_message(
|
||||
array('ikind' => $isuser ? $kind_user : $kind_agent, 'created' => time(), 'tmessage' => $postmessage,
|
||||
'tname' => $isuser ? getstring("chat.default.username") : "Administrator"), $outformat);
|
||||
}
|
||||
if ($outformat == "xml") {
|
||||
print("</thread>");
|
||||
} else {
|
||||
print(
|
||||
"</td></tr></table><a name='aend'></a>" .
|
||||
"</body></html>");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
@ -1,123 +0,0 @@
|
||||
<?php
|
||||
/*
|
||||
* Copyright 2005-2013 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
$ifregexp = "/\\\${(if|ifnot):([\w\.]+)}(.*?)(\\\${else:\\2}.*?)?\\\${endif:\\2}/s";
|
||||
$expand_include_path = "";
|
||||
$current_style = "";
|
||||
|
||||
function check_condition($condition)
|
||||
{
|
||||
global $errors, $page;
|
||||
if ($condition == 'errors') {
|
||||
return isset($errors) && count($errors) > 0;
|
||||
}
|
||||
return isset($page[$condition]) && $page[$condition];
|
||||
}
|
||||
|
||||
function expand_condition($matches)
|
||||
{
|
||||
global $page, $ifregexp;
|
||||
$value = check_condition($matches[2]) ^ ($matches[1] != 'if');
|
||||
if ($value) {
|
||||
return preg_replace_callback($ifregexp, "expand_condition", $matches[3]);
|
||||
} else if (isset($matches[4])) {
|
||||
return preg_replace_callback($ifregexp, "expand_condition", substr($matches[4], strpos($matches[4], "}") + 1));
|
||||
}
|
||||
return "";
|
||||
}
|
||||
|
||||
function expand_var($matches)
|
||||
{
|
||||
global $page, $webimroot, $jsver, $errors, $current_style;
|
||||
$prefix = $matches[1];
|
||||
$var = $matches[2];
|
||||
if (!$prefix) {
|
||||
if ($var == 'webimroot') {
|
||||
return $webimroot;
|
||||
} else if ($var == 'jsver') {
|
||||
return $jsver;
|
||||
} else if ($var == 'tplroot') {
|
||||
return "$webimroot/styles/$current_style";
|
||||
} else if ($var == 'styleid') {
|
||||
return $current_style;
|
||||
} else if ($var == 'pagination') {
|
||||
return generate_pagination($page['pagination']);
|
||||
} else if ($var == 'errors' || $var == 'harderrors') {
|
||||
if (isset($errors) && count($errors) > 0) {
|
||||
$result = getlocal("$var.header");
|
||||
foreach ($errors as $e) {
|
||||
$result .= getlocal("errors.prefix") . $e . getlocal("errors.suffix");
|
||||
}
|
||||
$result .= getlocal("errors.footer");
|
||||
return $result;
|
||||
}
|
||||
}
|
||||
|
||||
} else if ($prefix == 'msg:' || $prefix == 'url:') {
|
||||
if (strpos($var, ",") !== false) {
|
||||
$pos = strpos($var, ",");
|
||||
$param = substr($var, $pos + 1);
|
||||
$var = substr($var, 0, $pos);
|
||||
return getlocal2($var, array($page[$param]));
|
||||
}
|
||||
return getlocal($var);
|
||||
} else if ($prefix == 'form:') {
|
||||
return form_value($var);
|
||||
} else if ($prefix == 'page:') {
|
||||
return isset($page[$var]) ? $page[$var] : "";
|
||||
} else if ($prefix == 'if:' || $prefix == 'else:' || $prefix == 'endif:' || $prefix == 'ifnot:') {
|
||||
return "<!-- wrong $prefix:$var -->";
|
||||
}
|
||||
|
||||
return "";
|
||||
}
|
||||
|
||||
function expand_include($matches)
|
||||
{
|
||||
global $expand_include_path;
|
||||
$name = $matches[1];
|
||||
$contents = @file_get_contents($expand_include_path . $name) or die("cannot load template");
|
||||
return $contents;
|
||||
}
|
||||
|
||||
function expandtext($text)
|
||||
{
|
||||
global $ifregexp;
|
||||
$text = preg_replace_callback("/\\\${include:([\w\.]+)}/", "expand_include", $text);
|
||||
$text = preg_replace_callback($ifregexp, "expand_condition", $text);
|
||||
return preg_replace_callback("/\\\${(\w+:)?([\w\.,]+)}/", "expand_var", $text);
|
||||
}
|
||||
|
||||
function expand($basedir, $style, $filename)
|
||||
{
|
||||
global $expand_include_path, $current_style;
|
||||
start_html_output();
|
||||
if (!is_dir("$basedir/$style")) {
|
||||
$style = "default";
|
||||
}
|
||||
$expand_include_path = "$basedir/$style/templates/";
|
||||
$current_style = $style;
|
||||
$contents = @file_get_contents($expand_include_path . $filename);
|
||||
if ($contents === false) {
|
||||
$expand_include_path = "$basedir/default/templates/";
|
||||
$current_style = "default";
|
||||
$contents = @file_get_contents($expand_include_path . $filename) or die("cannot load template");
|
||||
}
|
||||
echo expandtext($contents);
|
||||
}
|
||||
|
||||
?>
|
@ -1,115 +0,0 @@
|
||||
<?php
|
||||
/*
|
||||
* Copyright 2005-2013 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
function setup_getcode_tabs($active)
|
||||
{
|
||||
global $page, $webimroot;
|
||||
$page['tabselected'] = $active;
|
||||
$page['tabs'] = array(
|
||||
array('title' => getlocal("page_getcode.tab.image"), 'link' => "$webimroot/operator/getcode.php"),
|
||||
array('title' => getlocal("page_getcode.tab.text"), 'link' => "$webimroot/operator/gettextcode.php"),
|
||||
);
|
||||
}
|
||||
|
||||
function generate_button($title, $locale, $style, $group, $inner, $showhost, $forcesecure, $modsecurity)
|
||||
{
|
||||
$link = get_app_location($showhost, $forcesecure) . "/client.php";
|
||||
if ($locale)
|
||||
$link = append_query($link, "locale=$locale");
|
||||
if ($style)
|
||||
$link = append_query($link, "style=$style");
|
||||
if ($group)
|
||||
$link = append_query($link, "group=$group");
|
||||
|
||||
$modsecfix = $modsecurity ? ".replace('http://','').replace('https://','')" : "";
|
||||
$jslink = append_query("'" . $link, "url='+escape(document.location.href$modsecfix)+'&referrer='+escape(document.referrer$modsecfix)");
|
||||
$temp = get_popup($link, "$jslink",
|
||||
$inner, $title, "webim", "toolbar=0,scrollbars=0,location=0,status=1,menubar=0,width=640,height=480,resizable=1");
|
||||
return "<!-- mibew button -->" . $temp . "<!-- / mibew button -->";
|
||||
}
|
||||
|
||||
function get_style_list($stylesfolder)
|
||||
{
|
||||
$stylelist = array("" => getlocal("page.preview.style_default"));
|
||||
if ($handle = opendir($stylesfolder)) {
|
||||
while (false !== ($file = readdir($handle))) {
|
||||
if (preg_match("/^\w+$/", $file) && is_dir("$stylesfolder/$file")) {
|
||||
$stylelist[$file] = $file;
|
||||
}
|
||||
}
|
||||
closedir($handle);
|
||||
}
|
||||
return $stylelist;
|
||||
}
|
||||
|
||||
function verifyparam_groupid($paramid)
|
||||
{
|
||||
global $settings, $errors;
|
||||
$groupid = "";
|
||||
if ($settings['enablegroups'] == '1') {
|
||||
$groupid = verifyparam($paramid, "/^\d{0,8}$/", "");
|
||||
if ($groupid) {
|
||||
$group = group_by_id($groupid);
|
||||
if (!$group) {
|
||||
$errors[] = getlocal("page.group.no_such");
|
||||
$groupid = "";
|
||||
}
|
||||
}
|
||||
}
|
||||
return $groupid;
|
||||
}
|
||||
|
||||
function get_groups_list()
|
||||
{
|
||||
global $settings;
|
||||
$result = array();
|
||||
if ($settings['enablegroups'] == '1') {
|
||||
$link = connect();
|
||||
$allgroups = get_all_groups($link);
|
||||
mysql_close($link);
|
||||
$result[] = array('groupid' => '', 'vclocalname' => getlocal("page.gen_button.default_group"));
|
||||
foreach ($allgroups as $g) {
|
||||
$result[] = $g;
|
||||
}
|
||||
}
|
||||
return $result;
|
||||
}
|
||||
|
||||
function get_image_locales_map($localesdir)
|
||||
{
|
||||
$imageLocales = array();
|
||||
$allLocales = get_available_locales();
|
||||
foreach ($allLocales as $curr) {
|
||||
$imagesDir = "$localesdir/$curr/button";
|
||||
if ($handle = @opendir($imagesDir)) {
|
||||
while (false !== ($file = readdir($handle))) {
|
||||
if (preg_match("/^(\w+)_on.gif$/", $file, $matches)
|
||||
&& is_file("$imagesDir/" . $matches[1] . "_off.gif")) {
|
||||
$image = $matches[1];
|
||||
if (!isset($imageLocales[$image])) {
|
||||
$imageLocales[$image] = array();
|
||||
}
|
||||
$imageLocales[$image][] = $curr;
|
||||
}
|
||||
}
|
||||
closedir($handle);
|
||||
}
|
||||
}
|
||||
return $imageLocales;
|
||||
}
|
||||
|
||||
?>
|
@ -1,66 +0,0 @@
|
||||
<?php
|
||||
/*
|
||||
* Copyright 2005-2013 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
function group_by_id($id)
|
||||
{
|
||||
global $mysqlprefix;
|
||||
$link = connect();
|
||||
$group = select_one_row(
|
||||
"select * from ${mysqlprefix}chatgroup where groupid = $id", $link);
|
||||
mysql_close($link);
|
||||
return $group;
|
||||
}
|
||||
|
||||
function get_group_name($group)
|
||||
{
|
||||
global $home_locale, $current_locale;
|
||||
if ($home_locale == $current_locale || !isset($group['vccommonname']) || !$group['vccommonname'])
|
||||
return $group['vclocalname'];
|
||||
else
|
||||
return $group['vccommonname'];
|
||||
}
|
||||
|
||||
function setup_group_settings_tabs($gid, $active)
|
||||
{
|
||||
global $page, $webimroot, $settings;
|
||||
if ($gid) {
|
||||
$page['tabselected'] = $active;
|
||||
$page['tabs'] = array(
|
||||
array('title' => getlocal("page_group.tab.main"), 'link' => "$webimroot/operator/group.php?gid=$gid"),
|
||||
array('title' => getlocal("page_group.tab.members"), 'link' => "$webimroot/operator/groupmembers.php?gid=$gid"),
|
||||
);
|
||||
} else {
|
||||
$page['tabs'] = array();
|
||||
}
|
||||
}
|
||||
|
||||
function get_operator_groupslist($operatorid, $link)
|
||||
{
|
||||
global $settings, $mysqlprefix;
|
||||
if ($settings['enablegroups'] == '1') {
|
||||
$groupids = array(0);
|
||||
$allgroups = select_multi_assoc("select groupid from ${mysqlprefix}chatgroupoperator where operatorid = $operatorid order by groupid", $link);
|
||||
foreach ($allgroups as $g) {
|
||||
$groupids[] = $g['groupid'];
|
||||
}
|
||||
return implode(",", $groupids);
|
||||
} else {
|
||||
return "";
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
@ -1,57 +0,0 @@
|
||||
<?php
|
||||
/*
|
||||
* Copyright 2005-2013 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
function log_notification($locale, $kind, $to, $subj, $text, $refop, $link)
|
||||
{
|
||||
global $mysqlprefix;
|
||||
$query = sprintf(
|
||||
"insert into ${mysqlprefix}chatnotification (locale,vckind,vcto,vcsubject,tmessage,refoperator,dtmcreated) values ('%s','%s','%s','%s','%s',%s,%s)",
|
||||
$locale,
|
||||
$kind,
|
||||
mysql_real_escape_string($to, $link),
|
||||
mysql_real_escape_string($subj, $link),
|
||||
mysql_real_escape_string($text, $link),
|
||||
$refop ? $refop : "0",
|
||||
"CURRENT_TIMESTAMP");
|
||||
|
||||
perform_query($query, $link);
|
||||
}
|
||||
|
||||
function webim_mail($toaddr, $reply_to, $subject, $body, $link)
|
||||
{
|
||||
global $webim_encoding, $webim_mailbox, $mail_encoding, $current_locale;
|
||||
|
||||
$headers = "From: $webim_mailbox\r\n"
|
||||
. "Reply-To: " . myiconv($webim_encoding, $mail_encoding, $reply_to) . "\r\n"
|
||||
. "Content-Type: text/plain; charset=$mail_encoding\r\n"
|
||||
. 'X-Mailer: PHP/' . phpversion();
|
||||
|
||||
$real_subject = "=?" . $mail_encoding . "?B?" . base64_encode(myiconv($webim_encoding, $mail_encoding, $subject)) . "?=";
|
||||
|
||||
$body = preg_replace("/\n/", "\r\n", $body);
|
||||
|
||||
log_notification($current_locale, "mail", $toaddr, $subject, $body, null, $link);
|
||||
@mail($toaddr, $real_subject, wordwrap(myiconv($webim_encoding, $mail_encoding, $body), 70), $headers);
|
||||
}
|
||||
|
||||
function webim_xmpp($toaddr, $subject, $text, $link)
|
||||
{
|
||||
global $current_locale;
|
||||
log_notification($current_locale, "xmpp", $toaddr, $subject, $text, null, $link);
|
||||
}
|
||||
|
||||
?>
|
@ -1,407 +0,0 @@
|
||||
<?php
|
||||
/*
|
||||
* Copyright 2005-2013 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
$can_administrate = 0;
|
||||
$can_takeover = 1;
|
||||
$can_viewthreads = 2;
|
||||
$can_modifyprofile = 3;
|
||||
|
||||
$can_count = 4;
|
||||
|
||||
$permission_ids = array(
|
||||
$can_administrate => "admin",
|
||||
$can_takeover => "takeover",
|
||||
$can_viewthreads => "viewthreads",
|
||||
$can_modifyprofile => "modifyprofile"
|
||||
);
|
||||
|
||||
function operator_by_login($login)
|
||||
{
|
||||
global $mysqlprefix;
|
||||
$link = connect();
|
||||
$operator = select_one_row(
|
||||
"select * from ${mysqlprefix}chatoperator where vclogin = '" . mysql_real_escape_string($login) . "'", $link);
|
||||
mysql_close($link);
|
||||
return $operator;
|
||||
}
|
||||
|
||||
function operator_by_email($mail)
|
||||
{
|
||||
global $mysqlprefix;
|
||||
$link = connect();
|
||||
$operator = select_one_row(
|
||||
"select * from ${mysqlprefix}chatoperator where vcemail = '" . mysql_real_escape_string($mail) . "'", $link);
|
||||
mysql_close($link);
|
||||
return $operator;
|
||||
}
|
||||
|
||||
function operator_by_id_($id, $link)
|
||||
{
|
||||
global $mysqlprefix;
|
||||
return select_one_row(
|
||||
"select * from ${mysqlprefix}chatoperator where operatorid = $id", $link);
|
||||
}
|
||||
|
||||
function operator_by_id($id)
|
||||
{
|
||||
$link = connect();
|
||||
$operator = operator_by_id_($id, $link);
|
||||
mysql_close($link);
|
||||
return $operator;
|
||||
}
|
||||
|
||||
function operator_get_all()
|
||||
{
|
||||
global $mysqlprefix;
|
||||
$link = connect();
|
||||
|
||||
$query = "select operatorid, vclogin, vclocalename, vccommonname, istatus, (unix_timestamp(CURRENT_TIMESTAMP)-unix_timestamp(dtmlastvisited)) as time " .
|
||||
"from ${mysqlprefix}chatoperator order by vclogin";
|
||||
$operators = select_multi_assoc($query, $link);
|
||||
mysql_close($link);
|
||||
return $operators;
|
||||
}
|
||||
|
||||
function operator_is_online($operator)
|
||||
{
|
||||
global $settings;
|
||||
return $operator['time'] < $settings['online_timeout'];
|
||||
}
|
||||
|
||||
function operator_is_available($operator)
|
||||
{
|
||||
global $settings;
|
||||
return $operator['istatus'] == 0 && $operator['time'] < $settings['online_timeout'] ? "1" : "";
|
||||
}
|
||||
|
||||
function operator_is_away($operator)
|
||||
{
|
||||
global $settings;
|
||||
return $operator['istatus'] != 0 && $operator['time'] < $settings['online_timeout'] ? "1" : "";
|
||||
}
|
||||
|
||||
function update_operator($operatorid, $login, $email, $jabber, $password, $localename, $commonname, $notify)
|
||||
{
|
||||
global $mysqlprefix;
|
||||
$link = connect();
|
||||
$query = sprintf(
|
||||
"update ${mysqlprefix}chatoperator set vclogin = '%s',%s vclocalename = '%s', vccommonname = '%s'" .
|
||||
", vcemail = '%s', vcjabbername= '%s', inotify = %s" .
|
||||
" where operatorid = %s",
|
||||
mysql_real_escape_string($login),
|
||||
($password ? " vcpassword='" . md5($password) . "'," : ""),
|
||||
mysql_real_escape_string($localename),
|
||||
mysql_real_escape_string($commonname),
|
||||
mysql_real_escape_string($email),
|
||||
mysql_real_escape_string($jabber),
|
||||
$notify,
|
||||
$operatorid);
|
||||
|
||||
perform_query($query, $link);
|
||||
mysql_close($link);
|
||||
}
|
||||
|
||||
function update_operator_avatar($operatorid, $avatar)
|
||||
{
|
||||
global $mysqlprefix;
|
||||
$link = connect();
|
||||
$query = sprintf(
|
||||
"update ${mysqlprefix}chatoperator set vcavatar = '%s' where operatorid = %s",
|
||||
mysql_real_escape_string($avatar), $operatorid);
|
||||
|
||||
perform_query($query, $link);
|
||||
mysql_close($link);
|
||||
}
|
||||
|
||||
function create_operator_($login, $email, $jabber, $password, $localename, $commonname, $notify, $avatar, $link)
|
||||
{
|
||||
global $mysqlprefix;
|
||||
$query = sprintf(
|
||||
"insert into ${mysqlprefix}chatoperator (vclogin,vcpassword,vclocalename,vccommonname,vcavatar,vcemail,vcjabbername,inotify) values ('%s','%s','%s','%s','%s','%s','%s',%s)",
|
||||
mysql_real_escape_string($login),
|
||||
md5($password),
|
||||
mysql_real_escape_string($localename),
|
||||
mysql_real_escape_string($commonname),
|
||||
mysql_real_escape_string($avatar),
|
||||
mysql_real_escape_string($email),
|
||||
mysql_real_escape_string($jabber),
|
||||
$notify);
|
||||
|
||||
perform_query($query, $link);
|
||||
$id = mysql_insert_id($link);
|
||||
|
||||
return select_one_row("select * from ${mysqlprefix}chatoperator where operatorid = $id", $link);
|
||||
}
|
||||
|
||||
function create_operator($login, $email, $jabber, $password, $localename, $commonname, $notify, $avatar)
|
||||
{
|
||||
$link = connect();
|
||||
$newop = create_operator_($login, $email, $jabber, $password, $localename, $commonname, $notify, $avatar, $link);
|
||||
mysql_close($link);
|
||||
return $newop;
|
||||
}
|
||||
|
||||
function notify_operator_alive($operatorid, $istatus)
|
||||
{
|
||||
global $mysqlprefix;
|
||||
$link = connect();
|
||||
perform_query("update ${mysqlprefix}chatoperator set istatus = $istatus, dtmlastvisited = CURRENT_TIMESTAMP where operatorid = $operatorid", $link);
|
||||
mysql_close($link);
|
||||
}
|
||||
|
||||
function has_online_operators($groupid = "")
|
||||
{
|
||||
global $settings, $mysqlprefix;
|
||||
loadsettings();
|
||||
$link = connect();
|
||||
$query = "select count(*) as total, min(unix_timestamp(CURRENT_TIMESTAMP)-unix_timestamp(dtmlastvisited)) as time from ${mysqlprefix}chatoperator";
|
||||
if ($groupid) {
|
||||
$query .= ", ${mysqlprefix}chatgroupoperator where groupid = $groupid and ${mysqlprefix}chatoperator.operatorid = " .
|
||||
"${mysqlprefix}chatgroupoperator.operatorid and istatus = 0";
|
||||
} else {
|
||||
$query .= " where istatus = 0";
|
||||
}
|
||||
$row = select_one_row($query, $link);
|
||||
mysql_close($link);
|
||||
return $row['time'] < $settings['online_timeout'] && $row['total'] > 0;
|
||||
}
|
||||
|
||||
function is_operator_online($operatorid, $link)
|
||||
{
|
||||
global $settings, $mysqlprefix;
|
||||
loadsettings_($link);
|
||||
$query = "select count(*) as total, min(unix_timestamp(CURRENT_TIMESTAMP)-unix_timestamp(dtmlastvisited)) as time " .
|
||||
"from ${mysqlprefix}chatoperator where operatorid = $operatorid";
|
||||
$row = select_one_row($query, $link);
|
||||
return $row['time'] < $settings['online_timeout'] && $row['total'] == 1;
|
||||
}
|
||||
|
||||
function get_operator_name($operator)
|
||||
{
|
||||
global $home_locale, $current_locale;
|
||||
if ($home_locale == $current_locale)
|
||||
return $operator['vclocalename'];
|
||||
else
|
||||
return $operator['vccommonname'];
|
||||
}
|
||||
|
||||
function append_query($link, $pv)
|
||||
{
|
||||
$infix = '?';
|
||||
if (strstr($link, $infix) !== FALSE)
|
||||
$infix = '&';
|
||||
return "$link$infix$pv";
|
||||
}
|
||||
|
||||
function check_login($redirect = true)
|
||||
{
|
||||
global $webimroot, $mysqlprefix;
|
||||
if (!isset($_SESSION["${mysqlprefix}operator"])) {
|
||||
if (isset($_COOKIE['webim_lite'])) {
|
||||
list($login, $pwd) = preg_split("/,/", $_COOKIE['webim_lite'], 2);
|
||||
$op = operator_by_login($login);
|
||||
if ($op && isset($pwd) && isset($op['vcpassword']) && md5($op['vcpassword']) == $pwd) {
|
||||
$_SESSION["${mysqlprefix}operator"] = $op;
|
||||
return $op;
|
||||
}
|
||||
}
|
||||
$requested = $_SERVER['PHP_SELF'];
|
||||
if ($_SERVER['REQUEST_METHOD'] == 'GET' && $_SERVER['QUERY_STRING']) {
|
||||
$requested .= "?" . $_SERVER['QUERY_STRING'];
|
||||
}
|
||||
if ($redirect) {
|
||||
$_SESSION['backpath'] = $requested;
|
||||
header("Location: $webimroot/operator/login.php");
|
||||
exit;
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
return $_SESSION["${mysqlprefix}operator"];
|
||||
}
|
||||
|
||||
function get_logged_in()
|
||||
{
|
||||
global $mysqlprefix;
|
||||
return isset($_SESSION["${mysqlprefix}operator"]) ? $_SESSION["${mysqlprefix}operator"] : FALSE;
|
||||
}
|
||||
|
||||
function login_operator($operator, $remember)
|
||||
{
|
||||
global $webimroot, $mysqlprefix;
|
||||
$_SESSION["${mysqlprefix}operator"] = $operator;
|
||||
if ($remember) {
|
||||
$value = $operator['vclogin'] . "," . md5($operator['vcpassword']);
|
||||
setcookie('webim_lite', $value, time() + 60 * 60 * 24 * 1000, "$webimroot/");
|
||||
|
||||
} else if (isset($_COOKIE['webim_lite'])) {
|
||||
setcookie('webim_lite', '', time() - 3600, "$webimroot/");
|
||||
}
|
||||
}
|
||||
|
||||
function logout_operator()
|
||||
{
|
||||
global $webimroot, $mysqlprefix;
|
||||
unset($_SESSION["${mysqlprefix}operator"]);
|
||||
unset($_SESSION['backpath']);
|
||||
if (isset($_COOKIE['webim_lite'])) {
|
||||
setcookie('webim_lite', '', time() - 3600, "$webimroot/");
|
||||
}
|
||||
}
|
||||
|
||||
function setup_redirect_links($threadid, $token)
|
||||
{
|
||||
global $page, $webimroot, $settings, $mysqlprefix;
|
||||
loadsettings();
|
||||
$link = connect();
|
||||
|
||||
$operatorscount = db_rows_count("${mysqlprefix}chatoperator", array(), "", $link);
|
||||
|
||||
$groupscount = 0;
|
||||
$groups = array();
|
||||
if ($settings['enablegroups'] == "1") {
|
||||
foreach (get_groups($link, true) as $group) {
|
||||
if ($group['inumofagents'] == 0) {
|
||||
continue;
|
||||
}
|
||||
$groups[] = $group;
|
||||
}
|
||||
$groupscount = count($groups);
|
||||
}
|
||||
|
||||
prepare_pagination(max($operatorscount, $groupscount), 8);
|
||||
$p = $page['pagination'];
|
||||
$limit = $p['limit'];
|
||||
|
||||
$operators = select_multi_assoc(db_build_select(
|
||||
"operatorid, vclogin, vclocalename, vccommonname, istatus, (unix_timestamp(CURRENT_TIMESTAMP)-unix_timestamp(dtmlastvisited)) as time",
|
||||
"${mysqlprefix}chatoperator", array(), "order by vclogin $limit"), $link);
|
||||
|
||||
$groups = array_slice($groups, $p['start'], $p['end'] - $p['start']);
|
||||
mysql_close($link);
|
||||
|
||||
$agent_list = "";
|
||||
$params = array('thread' => $threadid, 'token' => $token);
|
||||
foreach ($operators as $agent) {
|
||||
$params['nextAgent'] = $agent['operatorid'];
|
||||
$status = $agent['time'] < $settings['online_timeout']
|
||||
? ($agent['istatus'] == 0
|
||||
? getlocal("char.redirect.operator.online_suff")
|
||||
: getlocal("char.redirect.operator.away_suff")
|
||||
)
|
||||
: "";
|
||||
$agent_list .= "<li><a href=\"" . add_params($webimroot . "/operator/redirect.php", $params) .
|
||||
"\" title=\"" . topage(get_operator_name($agent)) . "\">" .
|
||||
topage(get_operator_name($agent)) .
|
||||
"</a> $status</li>";
|
||||
}
|
||||
$page['redirectToAgent'] = $agent_list;
|
||||
|
||||
$group_list = "";
|
||||
if ($settings['enablegroups'] == "1") {
|
||||
$params = array('thread' => $threadid, 'token' => $token);
|
||||
foreach ($groups as $group) {
|
||||
$params['nextGroup'] = $group['groupid'];
|
||||
$status = $group['ilastseen'] !== NULL && $group['ilastseen'] < $settings['online_timeout']
|
||||
? getlocal("char.redirect.operator.online_suff")
|
||||
: ($group['ilastseenaway'] !== NULL && $group['ilastseenaway'] < $settings['online_timeout']
|
||||
? getlocal("char.redirect.operator.away_suff")
|
||||
: "");
|
||||
$group_list .= "<li><a href=\"" . add_params($webimroot . "/operator/redirect.php", $params) .
|
||||
"\" title=\"" . topage(get_group_name($group)) . "\">" .
|
||||
topage(get_group_name($group)) .
|
||||
"</a> $status</li>";
|
||||
}
|
||||
}
|
||||
$page['redirectToGroup'] = $group_list;
|
||||
}
|
||||
|
||||
$permission_list = array();
|
||||
|
||||
function get_permission_list()
|
||||
{
|
||||
global $permission_list, $permission_ids;
|
||||
if (count($permission_list) == 0) {
|
||||
foreach ($permission_ids as $permid) {
|
||||
$permission_list[] = array(
|
||||
'id' => $permid,
|
||||
'descr' => getlocal("permission.$permid")
|
||||
);
|
||||
}
|
||||
}
|
||||
return $permission_list;
|
||||
}
|
||||
|
||||
function is_capable($perm, $operator)
|
||||
{
|
||||
$permissions = $operator && isset($operator['iperm']) ? $operator['iperm'] : 0;
|
||||
return $perm >= 0 && $perm < 32 && ($permissions & (1 << $perm)) != 0;
|
||||
}
|
||||
|
||||
function prepare_menu($operator, $hasright = true)
|
||||
{
|
||||
global $page, $settings, $can_administrate;
|
||||
$page['operator'] = topage(get_operator_name($operator));
|
||||
if ($hasright) {
|
||||
loadsettings();
|
||||
$page['showban'] = $settings['enableban'] == "1";
|
||||
$page['showgroups'] = $settings['enablegroups'] == "1";
|
||||
$page['showstat'] = $settings['enablestatistics'] == "1";
|
||||
$page['showadmin'] = is_capable($can_administrate, $operator);
|
||||
$page['currentopid'] = $operator['operatorid'];
|
||||
}
|
||||
}
|
||||
|
||||
function get_all_groups($link)
|
||||
{
|
||||
global $mysqlprefix;
|
||||
$query = "select ${mysqlprefix}chatgroup.groupid as groupid, vclocalname, vclocaldescription from ${mysqlprefix}chatgroup order by vclocalname";
|
||||
return select_multi_assoc($query, $link);
|
||||
}
|
||||
|
||||
function get_groups($link, $checkaway)
|
||||
{
|
||||
global $mysqlprefix;
|
||||
$query = "select ${mysqlprefix}chatgroup.groupid as groupid, vclocalname, vclocaldescription" .
|
||||
", (SELECT count(*) from ${mysqlprefix}chatgroupoperator where ${mysqlprefix}chatgroup.groupid = " .
|
||||
"${mysqlprefix}chatgroupoperator.groupid) as inumofagents" .
|
||||
", (SELECT min(unix_timestamp(CURRENT_TIMESTAMP)-unix_timestamp(dtmlastvisited)) as time " .
|
||||
"from ${mysqlprefix}chatgroupoperator, ${mysqlprefix}chatoperator where istatus = 0 and " .
|
||||
"${mysqlprefix}chatgroup.groupid = ${mysqlprefix}chatgroupoperator.groupid " .
|
||||
"and ${mysqlprefix}chatgroupoperator.operatorid = ${mysqlprefix}chatoperator.operatorid) as ilastseen" .
|
||||
($checkaway
|
||||
? ", (SELECT min(unix_timestamp(CURRENT_TIMESTAMP)-unix_timestamp(dtmlastvisited)) as time " .
|
||||
"from ${mysqlprefix}chatgroupoperator, ${mysqlprefix}chatoperator where istatus <> 0 and " .
|
||||
"${mysqlprefix}chatgroup.groupid = ${mysqlprefix}chatgroupoperator.groupid " .
|
||||
"and ${mysqlprefix}chatgroupoperator.operatorid = ${mysqlprefix}chatoperator.operatorid) as ilastseenaway"
|
||||
: ""
|
||||
) .
|
||||
" from ${mysqlprefix}chatgroup order by vclocalname";
|
||||
return select_multi_assoc($query, $link);
|
||||
}
|
||||
|
||||
function get_operator_groupids($operatorid)
|
||||
{
|
||||
global $mysqlprefix;
|
||||
$link = connect();
|
||||
$query = "select groupid from ${mysqlprefix}chatgroupoperator where operatorid = $operatorid";
|
||||
$result = select_multi_assoc($query, $link);
|
||||
mysql_close($link);
|
||||
return $result;
|
||||
}
|
||||
|
||||
?>
|